10

可以说我有一个像0x448. 在二进制中,这是0100 0100 1000.

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

所以,例如

位为 1:

b12            b0 
  0100 0100 1110
            ^^^

位为 0:

b12            b0
  0100 0100 0000
            ^^^

我猜想将它们设置为 1 我使用按位或掩码为 14 (0x000e)?但如果是这种情况,我该如何做类似的事情来清除这些位?


有关的:

4

7 回答 7

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 模式的逻辑非(每位反转):

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

所以你可以使用你最喜欢的语言 NOT 操作,而不必找出两个值。

于 2009-04-15T03:59:22.823 回答
4

假设您有一个掩码 m,其中所有要设置或清除的位的位设置为 1,否则为 0:

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

如果你只对一位感兴趣,在位置 p(从 0 开始),掩码很简单可以表示为 m = 1 << p

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

  • ~ 是 1 补码:~10001010 = 01110101
  • & 是按位与
  • | 是按位或
  • ^ 是按位异或
  • << 是左位移位:10001010 << 2 = 00101000
于 2009-04-15T03:58:07.617 回答
1

OR 与 1 始终为真;AND 与 0 总是错误的。:)

于 2009-04-15T03:55:18.683 回答
0

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

与(非 0x14)

于 2009-04-15T03:56:29.833 回答
0

用于清除位使用 AND 与 0x440

于 2009-04-15T03:59:42.183 回答
0
number &= ~0xe
于 2009-04-15T04:01:57.700 回答
0

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

 1 <<3     = 00001000

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

最后一步产生了一个掩码来清除从最高位到 p 位的位。您可以使用 tilda 将其反转以清除另一半。希望这可以帮助。

于 2013-11-05T18:15:34.047 回答