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

Mit*_*rax 10 language-agnostic bit-manipulation

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

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

所以,例如

比特为1:

b12            b0 
  0100 0100 1110
            ^^^
Run Code Online (Sandbox Code Playgroud)

比特为0:

b12            b0
  0100 0100 0000
            ^^^
Run Code Online (Sandbox Code Playgroud)

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


有关:

sta*_*san 19

您将位设置正确:OR使用要设置的位的掩码.

位清除位非常相似:AND使用要清零的位的补码.

示例:Word 0x0448.

设置位1,2和3将是Word OR 0x000e:

    0000 0100 0100 1000 = 0x0448
 OR 0000 0000 0000 1110 = 0x000e
    ---- ---- ---- ----
  = 0000 0100 0100 1110 = 0x044e
Run Code Online (Sandbox Code Playgroud)

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

    0000 0100 0100 1000 = 0x0448
AND 1111 1111 1111 0001 = 0xfff1
    ---- ---- ---- ----
  = 0000 0100 0100 0000 = 0x0440
Run Code Online (Sandbox Code Playgroud)

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

 OR 0000 0000 0000 1110 = 0x000e
AND 1111 1111 1111 0001 = 0xfff1
Run Code Online (Sandbox Code Playgroud)

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