2

如果我们有一个十进制值:123
及其二进制版本:01111011

我怎样才能从这个字节中得到最左边的四个和最右边的四个位到 2 个单独的int变量中?

我是说:

int a = 7;  // 0111 (the first four bits from the left)
int b = 11; // 1011 (the first four bits from the right)

非常感激!

4

1 回答 1

9
int x = 123;
int low = x & 0x0F;
int high = (x & 0xF0) >> 4;

这称为掩蔽移位。通过ANDing with 0xF(它是 binary 00001111),我们删除了高四位。AND使用0xF0(二进制11110000)删除低四位。然后(在后一种情况下),我们向右移动 4 位,实际上,推开低 4 位,只留下高 4 位。

正如@owlstead 在下面的评论中所说,还有另一种获得更高位的方法。我们可以直接移位,而不是屏蔽低位然后移位。

int high = x >> 4;

请注意,我们不需要屏蔽低位,因为无论它们是什么,它们都消失了(我们已经将它们推出了)。上面的例子更清楚,因为我们首先明确地将它们归零,但对于这个特定的例子没有必要这样做。

但是要处理大于 16 位(int通常是 32 位)的数字,我们仍然需要屏蔽,因为我们可以让更高的16 位妨碍!

int high = (x >> 4) & 0x0F;

于 2012-10-08T23:43:40.227 回答