取得 - Goでシングルビットをどのように設定してクリアしますか。
golang struct タグ 取得 (2)
これはビットを設定するための関数です。 最初に、数値1を整数内の指定された数のスペースだけシフトします(したがって、0010、0100などになります)。 それから元の入力とORする。 これにより、他のビットは影響を受けませんが、ターゲットビットは常に1に設定されます。
// Sets the bit at pos in the integer n.
func setBit(n int, pos uint) int {
n |= (1 << pos)
return n
}
これは少しクリアする機能です。 最初に数字1を整数の指定された数のスペースだけシフトします(したがって0010、0100などになります)。 次に、 ^
演算子を使ってマスク内のすべてのビットを反転します(したがって0010は1101になります)。 次に、ビット単位のANDを使用します。これは、1とAND
た数字には触れませんが、0に設定されているマスク内の値を設定解除します。
// Clears the bit at pos in n.
func clearBit(n int, pos uint) int {
mask := ^(1 << pos)
n &= mask
return n
}
最後に、ビットが設定されているかどうかをチェックする関数です。 数値1を指定されたスペース数だけシフトし(0010、0100などになるように)、次にターゲット数とANDします。 結果の数値が0より大きい場合(1、2、4、8など)、ビットが設定されます。
func hasBit(n int, pos uint) bool {
val := n & (1 << pos)
return (val > 0)
}
Golangでは、整数の個々のビットをどのように設定および消去しますか? たとえば、次のように動作する関数は、
clearBit(129, 7) // returns 1
setBit(1, 7) // returns 129
ちょっとわかりやすい表記法もあります。 そのための演算子は&^
あり、 "and not"と呼ばれます。
この演算子を使うと、 clearBit
関数は次のように書くことができます。
// Clears the bit at pos in n.
func clearBit(n int, pos uint) int {
n &^= (1 << pos)
return n
}
またはこんな感じ:
// Clears the bit at pos in n.
func clearBit(n int, pos uint) int {
return n &^ (1 << pos)
}