gpt4 book ai didi

c - C中的按位逻辑

转载 作者:行者123 更新时间:2023-12-04 10:13:45 26 4
gpt4 key购买 nike

我对位运算有一定的了解,但这个函数让我难以理解。

void binary_print(unsigned int value) {
unsigned int mask = 0xff000000; // Start with a mask for the highest byte.
unsigned int shift = 256*256*256; // Start with a shift for the highest byte.
unsigned int byte, byte_iterator, bit_iterator;

for (byte_iterator=0; byte_iterator < 4; byte_iterator++) {
byte = (value & mask) / shift; // Isolate each byte.
printf(" ");

for (bit_iterator=0; bit_iterator < 8; bit_iterator++) {
// Print the byte's bits.
if (byte & 0x80) // If the highest bit in the byte isn't 0,
printf("1"); // print a 1.
else
printf("0"); // Otherwise, print a 0.

byte *= 2; // Move all the bits to the left by 1.
}
mask /= 256; // Move the bits in mask right by 8.
shift /= 256; // Move the bits in shift right by 8.
}
}

此函数接收 open() 函数的位标志,并借助添加了适当标签的 display_flags 函数生成以下输出:

O_RDONLY : 0 : 00000000 00000000 00000000 00000000
O_WRONLY : 1 : 00000000 00000000 00000000 00000001
O_RDWR : 2 : 00000000 00000000 00000000 00000010
O_APPEND : 1024 : 00000000 00000000 00000100 00000000
O_TRUNC : 512 : 00000000 00000000 00000010 00000000
O_CREAT : 64 : 00000000 00000000 00000000 01000000
O_WRONLY|O_APPEND|O_CREAT : 1089 : 00000000 00000000 00000100 01000001

我理解输出没有问题,但我不理解实际过程:

  1. byte = (value & mask)/shift 如何隔离各个位?
  2. 为什么 if(byte & 0x80) 的意思是“如果字节中的最高位不为 0?”
  3. 这些行如何:byte *= 2;mask/= 256;shift/= 256; 移动位以及原因这个操作重要吗?

最佳答案

<强>1。 byte = (value & mask) / shift如何隔离各个位?

mask是一个位模式,它始终将 8 个连续位设置为 1,其余位设置为 0(它以 0xff000000 开头,然后是 0x00ff0000,依此类推。因此,当您采用 maskvalue 的按位与时,所有来自 value 的位都将设置为 0,除了与 mask 指定的字节对应的那些。那些保留其值。

shift设置为与shift相除的对应值那些在掩码中幸存下来的位将最终出现在最右边的位中(请参阅问题 3 的答案,这是如何工作的)。

所以假设value0xDEADBEEF , mask有它的初始值 0xff000000 , 和 shift有它的初始值 256*256*256 .那么value & mask0xDE000000 ,最终结果为0x000000DE .

二进制的例子是

value       = 11011110101011011011111011101111
mask = 11111111000000000000000000000000
byte & mask = 11011110000000000000000000000000
result = 00000000000000000000000001101111

<强>2。为什么 if(byte & 0x80)表示“如果字节中的最高位不为 0?”

这里代码作者想到了byte是一个 8 位变量。虽然它在技术上更大,但这里从未使用过更高的位。因此,当作者提到“最高位”时,想想从右数第 8 位(如果 byte 实际上只有一个字节大小的最高位)。

现在注意 0x8010000000以二进制形式。所以当你拿 byte & 0x80 , 来自 byte 的所有位将设置为 0,“最高”(右起第 8 个)除外。所以byte & 0x80为零,如果来自 byte 的最高位为零,大于零,如果来自 byte 的“最高”位为 1。

<强>3。这些行如何:byte *= 2; , mask /= 256;shift /= 256;移动位,为什么这个操作很重要?

与 2 相乘相当于将位向左移动 1。例如考虑值 9,即 1001以二进制形式。乘以 2 得到 18,即 10010二进制。

与除以 2 类似,这是向右移 1。除以 256 相当于 8 个除以 2,因此除以 256 相当于右移 8 位。例如,这些操作在这里用于更改值 mask来自 0xff0000000x00ff0000 , 0x0000ff00 , 最后到 0x000000ff .

完整功能说明

有了这些知识,我们就可以看到完整的函数做了什么。在外层循环中,它遍历 value 中的 4 个字节。 ,从最左边的开始,到最右边的结束。它通过屏蔽当前字节并将其存储在 byte 中来实现。 .

内部循环然后遍历存储在 byte 中的 8 位.它总是从右边看第 8 位并相应地打印 1 或 0。然后它向左移动位,这样在第二次迭代中,从右数第 7 位现在是从右数第 8 位,将被打印,然后是下一个,等等,直到所有 8 位都从右到右打印-左顺序。

编写此函数的另一种方法是

for (int i = 31; i >= 0; i--) {
if (value & (1 << i))
printf("1");
else
printf("0");

if (i % 8 == 0)
printf(" ");
}

这将简单地遍历 value 中的所有位按从左到右的顺序。表达式 value (1 << i)value 中选择所需的位,从右起第 32 个开始(当 i 为 31 时),并从右起第 1 个结束(当 i 为 0 时)。

关于c - C中的按位逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14911216/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com