c# - 获取特定位并获取一个ushort值的前14位

时间:2017-04-20 04:20:27

标签: c# bit-manipulation bitmask ushort

在阅读了关于位移/屏蔽的所有问题和答案后,我根本无法绕过它。我只是不了解它在基础层面上的运作方式。我已经能够通过使用BitArray和BitConverter来实现各种技术,但我真的想更好地理解位移/屏蔽。

我的具体需求是做以下事情:

我有一个ushort: 0x810E (33038)

使用位移/屏蔽,我想知道如何:

  • 获得第16位结果:1​​
  • 获得第15位结果:0
  • 获取一系列位以创建新的ushort值,特别是 前14位结果:270

正如我所说,我能够使用BitArray执行这些任务,这是我获得正确结果的方法,但我想了解如何使用位移/屏蔽来执行这些操作。

任何帮助都将不胜感激。

1 个答案:

答案 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);

其中(0xFFFF00000000 00000000 11111111 11111111)。