问题描述
我正在尝试检查字符的一个特定位,例如我们有“11110xxx”的第一个八位字节上的一个表情符号“?”,我需要检查 3 位是否为 0,但我不知道是什么要做!
我从互联网上得到了一些代码,例如:
printf( "%d",( buffer[0] >> 3 ) & 1 ? 1 : 0);
它有效,但我试过了:
printf("%d",(buffer[0] >> 3) & 1);
并且可以工作,但没有 & 1
不会:
所以我想知道它是什么:
? 1 : 0 //Works without
以及它需要工作的& 1
另一件事是,我从右向左或从左向右移动?我试过这个:
printf("%d",(buffer[0] << 3) & 1);
但不起作用。
我正在尝试学习如何使用字节
解决方法
? 1 : 0
是三元运算符的后半部分。写入 A ? B : C
,当 B
为真(非零)时计算 A
,当 C
为假(零)时计算 A
。
& 1
是按位与运算符加一。它是通过使用 AND 和 1 来提取最后一位 (LSB)。
如果您想使用从右到左的移位,您可以将其应用于 1
。
printf("%d",buffer[0] & (1 << 3) ? 1 : 0);
,
并且可以,但没有 & 1 则不行。
因为 & 1
将除低位以外的所有位都设置为零。示例:0xff >> 3 == 0x1f
和 (0xff >> 3) & 1 == 1
。
2.
另一件事是,我从右移到左或从左移到 对?我试过这个:
printf("%d",(buffer[0] << 3) & 1);
左移时,最低位设置为零。因此 & 1
的结果将始终为零(如第 1 点所述)。
通常,如果您想检查第 n 位是否已设置,您可以:
(val >> n) & 1
val & (1 << n)
- 如果在逻辑语句中使用,或者如果您需要将值设为 zero
或 one
:!!(val & (1 << n))
或 val & (1 << n) ? 1 : 0
或 {{ 1}}