检查字符的位

问题描述

我正在尝试检查字符的一个特定位,例如我们有“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) - 如果在逻辑语句中使用,或者如果您需要将值设为 zeroone!!(val & (1 << n))val & (1 << n) ? 1 : 0 或 {{ 1}}