用C中的按位运算符分隔字节中的Nybbles

use*_*460 2 c bits bit-manipulation

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

如何从该字节中将最左边的四个和最右边的四个位变为两个独立的int变量?

我的意思是:

int a = 7;  // 0111 (the first four bits from the left)
int b = 11; // 1011 (the first four bits from the right)
Run Code Online (Sandbox Code Playgroud)

非常感激!

Mah*_*dsi 9

int x = 123;
int low = x & 0x0F;
int high = (x & 0xF0) >> 4;
Run Code Online (Sandbox Code Playgroud)

这称为掩蔽移位.通过AND使用0xF(二进制00001111),我们删除了更高的四位.ANDwith 0xF0(二进制11110000)删除低四位.然后(在后一种情况下),我们向右移动4位,实际上,推掉了低4位,只剩下高4位.

正如@owlstead在下面的评论中所说,还有另一种方法来获得更高的位.我们可以改变,而不是掩盖低位然后移位.

int high = x >> 4;

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

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

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

  • 我总是执行"&",因为它更清晰,也适用于16位数字. (2认同)