【问题标题】:How would you set and clear a single bit in Go?你将如何在 Go 中设置和清除单个位?
【发布时间】:2014-04-21 06:42:28
【问题描述】:

在 Golang 中,如何设置和清除整数的各个位?例如,行为如下的函数:

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

【问题讨论】:

    标签: go bit-manipulation


    【解决方案1】:

    这是一个设置位的函数。首先,将数字 1 移动整数中指定的空格数(因此变为 0010、0100 等)。然后将其与原始输入进行或。这不会影响其他位,但将始终将目标位设置为 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)。然后使用按位与,它不会触及带有 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 等),然后将其与目标数字相加。如果结果数大于 0(它将是 1、2、4、8 等),则设置该位。

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

    【讨论】:

    • 请注意,只写x &amp;= ^(1&lt;&lt;7)x |= 1&lt;&lt;7(或x ^= 1&lt;&lt;7 进行切换,或(x &amp; 1&lt;&lt;7 == 0) 以查看是否设置了位)可能更简单。这已被广泛理解,不需要评论,但如果你觉得你应该解释(例如,你的团队不是来自一个有点扭扭捏捏的世界),只需评论一下你第一次使用每个成语的意图。此外,人们经常定义表示位或位组合的常量,因此他们不必每次都写出1&lt;&lt;n 并记住正确的niota 可以帮助使这些常量声明简洁。
    • 同意,我刚刚提取了变量以提高清晰度/可读性。编译器也有可能进行这些优化。
    • func hasBit(n int, pos uint) bool { val := n & (1
    【解决方案2】:

    还有一个简洁的符号来清除一点。其操作符是&amp;^,称为“而不是”。

    使用这个运算符,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)
    }
    

    【讨论】:

      猜你喜欢
      • 2023-02-14
      • 2010-11-29
      • 1970-01-01
      • 2013-06-03
      • 2010-09-08
      相关资源
      最近更新 更多