屏蔽单个位
您可能知道,ushort
是一个 16 位的值,因此您给定的数字0x810E
也可以写为
10000001 00001110
因为 没有移位运算符ushort
,所以首先将值转换为int
。
所以,如果你想得到第 15 位,你可以拿一个位
000000000 0000000 00000000 00000001
并将其向左移动 14 次(右侧填充0
)
00000000 00000000 01000000 00000000
并且您已经创建了一个位掩码。
现在,如果您将 mask 和 value 与 bitwise 结合起来and
,您将仅获得第 15 位的值:
00000000 00000000 10000001 00001110
& 00000000 00000000 01000000 00000000
= 00000000 00000000 00000000 00000000
这0
又是。要访问该位,您必须将整个结果向右移动 14 次并将其转换为ushort
.
这可以用以下代码表示:
ushort value_15 = (ushort)(((1 << 14) & value) >> 14);
我们能做得更好吗?
虽然这种方法看起来是正确的,但是有一个更简单的方法可以做到这一点:将原始值向右移动 14 次(结果是00000000 00000000 00000000 00000010
,左侧被 填充0
)并执行一个简单的按位&
with 1
:
00000000 00000000 00000000 00000000 00000000 00000010
& 00000000 00000000 00000000 00000000 00000000 00000001
= 00000000 00000000 00000000 00000000 00000000 00000000
这导致C#
:
ushort value_15 = (ushort)((value >> 14) & 1);
因此,您避免了一次额外的移位,即使使用
有符号数,我们也会得到相同的结果(因为用于符号的最高位通过移位保持不变)。
屏蔽位范围
要屏蔽位范围,您所要做的就是更改您的掩码。因此,要获取低 14 位的值,您可以使用掩码
00000000 00000000 10000001 00001110
& 00000000 00000000 00111111 11111111
= 00000000 00000000 00000001 00001110
在C#
这可以用
ushort first14bits = (ushort)((0xFFFF >> 2) & value);
其中 (0xFFFF
是00000000 00000000 11111111 11111111
)。