c - 在 C 中使用按位运算符分隔字节中的 Nybbles

标签 c bit-manipulation bit

如果我们有十进制值: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)

非常感谢!

最佳答案

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

这称为掩蔽移位。通过 AND0xF(二进制 00001111)相结合,我们删除了高四位。 AND0xF0(二进制 11110000)删除低四位。然后(在后一种情况下),我们向右移动 4 位,实际上,推开低 4 位,只留下高 4 位。

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

int high = x >> 4;

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

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

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

关于c - 在 C 中使用按位运算符分隔字节中的 Nybbles,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12790961/

相关文章:

c - STDIN 重定向 : how to make program end once fgets() reads an expected ending line

c - 将 C 编写为 s 表达式

C 位字段(可能是位精度)

java - 找出已更改的位数(按位运算符)

java - 调用 C 函数时,Toast 不显示

java - 2个箭头和3个箭头的位移位有什么区别?

byte - B 在 MB/GB、位或字节中代表什么?

java - Java 或 C 中字符的位操作?

c - 查找元素是否在指定数组中

c++ - 有没有一种方法可以将 Lua 成员变量绑定(bind)为使用该变量的名称调用 C/C++ 函数