假设我有一个类似 0x448
的号码.在二进制中,这是 0100 0100 1000
.
如何使用按位运算将位 1、2 和 3 设置为全 0 或全 1?当我说前三个时,我将最右边的位算作零位。
所以,例如
位为 1:
b12 b0
0100 0100 1110
^^^
位为 0:
b12 b0
0100 0100 0000
^^^
我猜想将它们设置为 1 我使用位或掩码为 14 (0x000e)?但如果是这种情况,我该如何做类似的事情来清除这些位?
有关的:
最佳答案
您的位设置正确: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 操作,而不必计算出两个值。
关于language-agnostic - 如何使用按位运算设置或清除前 3 位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/750240/