在阅读了关于位移/屏蔽的所有问题和答案后,我根本无法绕过它。我只是不了解它在基础层面上的运作方式。我已经能够通过使用BitArray和BitConverter来实现各种技术,但我真的想更好地理解位移/屏蔽。
我的具体需求是做以下事情:
我有一个ushort: 0x810E (33038)
使用位移/屏蔽,我想知道如何:
正如我所说,我能够使用BitArray执行这些任务,这是我获得正确结果的方法,但我想了解如何使用位移/屏蔽来执行这些操作。
任何帮助都将不胜感激。
答案 0 :(得分:1)
屏蔽单个位
您可能知道,ushort
是一个16位值,因此您的给定数字0x810E
也可以写为
10000001 00001110
由于ushort
没有转换运算符,因此该值首先转换为int
。
所以,如果你想获得第15位,你可以拿一个位
000000000 0000000 00000000 00000001
并将其向左移动14次(右侧填充0
)
00000000 00000000 01000000 00000000
您已创建位掩码。
现在,如果将掩码和值与按位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
),并使用&
执行简单的按位1
:
00000000 00000000 00000000 00000000 00000000 00000010
& 00000000 00000000 00000000 00000000 00000000 00000001
= 00000000 00000000 00000000 00000000 00000000 00000000
这导致C#
in:
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
)。