取得 - 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)
}




bit-manipulation