如何使用按位运算设置或清除前3位?

时间:2009-04-15 03:53:31

标签: language-agnostic bit-manipulation

假设我有一个像0x448这样的数字。在二进制文件中,这是0100 0100 1000

如何使用逐位运算将位1,2和3设置为全0或全1?当我说前三个时,我将最右边的位数作为零位。

所以,例如

比特为1:

b12            b0 
  0100 0100 1110
            ^^^

比特为0:

b12            b0
  0100 0100 0000
            ^^^

我猜测它将它们设置为1我使用bit-wise OR且掩码为14(0x000e)?但如果是这种情况,我该如何做清除比特的类似事情?


相关:

7 个答案:

答案 0 :(得分:19)

您的位设置正确:OR,其中包含您要设置的位的掩码。

位清除位非常相似:AND,其中包含要清零的位的补码。

示例:0x0448的单词。

设置位1,2和3为Word OR 0x000e

    0000 0100 0100 1000 = 0x0448
 OR 0000 0000 0000 1110 = 0x000e
    ---- ---- ---- ----
  = 0000 0100 0100 1110 = 0x044e

清除位1,2和3将是Word AND 0xfff1

    0000 0100 0100 1000 = 0x0448
AND 1111 1111 1111 0001 = 0xfff1
    ---- ---- ---- ----
  = 0000 0100 0100 0000 = 0x0440

对于补码的详细说明,用于清除的AND模式是用于设置的OR模式的逻辑NOT(每个位被尊重):

 OR 0000 0000 0000 1110 = 0x000e
AND 1111 1111 1111 0001 = 0xfff1

所以你可以使用你喜欢的语言而不是操作,而不必弄清楚这两个值。

答案 1 :(得分:4)

假设你有一个掩码m,对于你想要设置或清除的所有位,位设置为1,否则为0:

  • 清除位:x& (〜m)的
  • 设置位:x |米
  • 翻转位:x ^ m

如果你只对一位感兴趣,在位置p(从0开始),掩码很容易表达m = 1<< P

请注意,我使用的是C风格的约定,其中包含:

  • 〜是1补码:~10001010 = 01110101
  • &安培;是按位AND
  • |是按位OR
  • ^是按位XOR
  • <<是左移位:10001010<< 2 = 00101000

答案 2 :(得分:1)

OR与1总是正确的; AND与0始终为false。 :)

答案 3 :(得分:0)

假设您的OR 0x14正确,清除将是:

AND(不是0x14)

答案 4 :(得分:0)

用于清除位使用AND和0x440

答案 5 :(得分:0)

number &= ~0xe

答案 6 :(得分:0)

让我们确保位从右侧开始计数,或从最低位开始向左计数。然后观察这个:      1<

 1 <<3     = 00001000

 1 <<p - 1 puts 1 at all positions up to p, exclusive 
 1 <<3-1=00000111

最后一步产生了一个掩码,用于清除从最重要到最重要的位。您可以使用tilda将其反转以清除另一半。希望这会有所帮助。