How would you set and clear a single bit in Go?

huangapple go评论80阅读模式
英文:

How would you set and clear a single bit in Go?

问题

在Golang中,你可以使用位运算来设置和清除整数的单个位。例如,可以使用以下函数来实现:

func clearBit(num int, pos uint) int {
    mask := ^(1 << pos)
    return num & mask
}

func setBit(num int, pos uint) int {
    mask := 1 << pos
    return num | mask
}

使用示例:

clearBit(129, 7) // 返回 1
setBit(1, 7)     // 返回 129

以上代码中,clearBit函数会将指定位置的位清零,setBit函数会将指定位置的位设置为1。

英文:

In Golang, how do you set and clear individual bits of an integer? For example, functions that behave like this:

 clearBit(129, 7) // returns 1
 setBit(1, 7)     // returns 129

答案1

得分: 63

这是一个设置位的函数。首先,在整数中将数字1向左移动指定的位数(这样它就变成0010、0100等)。然后,将其与原始输入进行按位或运算。这样可以保持其他位不变,但总是将目标位设置为1。

// 在整数n的位置pos设置位。
func setBit(n int, pos uint) int {
    n |= (1 << pos)
    return n
}

这是一个清除位的函数。首先,在整数中将数字1向左移动指定的位数(这样它就变成0010、0100等)。然后,使用^运算符翻转掩码中的每一位(所以0010变成1101)。然后使用按位与运算,它不会影响与1进行与运算的数字,但会将掩码中值为0的位取消设置。

// 清除n中位置pos的位。
func clearBit(n int, pos uint) int {
    mask := ^(1 << pos)
    n &= mask
    return n
}

最后,这是一个检查位是否设置的函数。将数字1向左移动指定的位数(这样它就变成0010、0100等),然后与目标数字进行按位与运算。如果结果大于0(它将是1、2、4、8等),则表示位已设置。

func hasBit(n int, pos uint) bool {
    val := n & (1 << pos)
    return (val > 0)
}
英文:

Here's a function to set a bit. First, shift the number 1 the specified number of spaces in the integer (so it becomes 0010, 0100, etc). Then OR it with the original input. This leaves the other bits unaffected but will always set the target bit to 1.

// Sets the bit at pos in the integer n.
func setBit(n int, pos uint) int {
	n |= (1 &lt;&lt; pos)
	return n
}

Here's a function to clear a bit. First shift the number 1 the specified number of spaces in the integer (so it becomes 0010, 0100, etc). Then flip every bit in the mask with the ^ operator (so 0010 becomes 1101). Then use a bitwise AND, which doesn't touch the numbers AND'ed with 1, but which will unset the value in the mask which is set to 0.

// Clears the bit at pos in n.
func clearBit(n int, pos uint) int {
    mask := ^(1 &lt;&lt; pos)
	n &amp;= mask
	return n
}

Finally here's a function to check whether a bit is set. Shift the number 1 the specified number of spaces (so it becomes 0010, 0100, etc) and then AND it with the target number. If the resulting number is greater than 0 (it'll be 1, 2, 4, 8, etc) then the bit is set.

func hasBit(n int, pos uint) bool {
	val := n &amp; (1 &lt;&lt; pos)
	return (val &gt; 0)
}

答案2

得分: 22

还有一种简洁的表示法可以清除一个位。该运算符是 &amp;^,称为 "and not"。

使用这个运算符,clearBit 函数可以这样写:

// 清除 n 中位置为 pos 的位。
func clearBit(n int, pos uint) int {
    n &amp;^= (1 &lt;&lt; pos)
    return n
}

或者像这样写:

// 清除 n 中位置为 pos 的位。
func clearBit(n int, pos uint) int {
    return n &amp;^ (1 &lt;&lt; pos)
}
英文:

There is also a compact notation to clear a bit. The operator for that is &amp;^ and called "and not".

Using this operator the clearBit function can be written like this:

// Clears the bit at pos in n.
func clearBit(n int, pos uint) int {
    n &amp;^= (1 &lt;&lt; pos)
    return n
}

Or like this:

// Clears the bit at pos in n.
func clearBit(n int, pos uint) int {
    return n &amp;^ (1 &lt;&lt; pos)
}

huangapple
  • 本文由 发表于 2014年4月21日 14:42:28
  • 转载请务必保留本文链接:https://go.coder-hub.com/23192262.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定