- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我希望能够从键盘输入一个字符并以 00000001 格式显示该键的二进制代码。
此外,我还想以一种允许我输出它们是真还是假的方式读取这些位。
例如
01010101 = false,true,false,true,false,true,false,true
我会发布一个想法,说明我自己是如何尝试做到这一点的,但我完全不知道,我仍在尝试使用 C,这是我第一次尝试在如此低的级别上进行编程。
谢谢
最佳答案
对于位调整,使用无符号类型通常更安全,因为带符号负值的移位具有依赖于实现的效果。平原char
可以是签名的或未签名的(传统上,它在 MacIntosh 平台上是未签名的,但在 PC 上是签名的)。因此,首先将您的角色放入 unsigned char
类型。
然后,您的 friend 是按位 bool 运算符( &
、 |
、 ^
和 ~
)和移位运算符( <<
和 >>
)。例如,如果您的角色在变量 x
中,然后要获得第 5 位,您只需使用:((x >> 5) & 1)
.移位运算符将值向右移动,丢弃低五位并将您感兴趣的位移动到“最低位置”(又名“最右边”)。与 1 的按位 AND 只是将所有其他位设置为 0,因此结果值为 0 或 1,这是您的位。请注意,我从左有效位(最右侧)到最高有效位(最左侧)对位进行编号,并且我从零开始,而不是一。
如果您假设您的字符是 8 位,您可以将代码编写为:
unsigned char x = (unsigned char)your_character;
int i;
for (i = 7; i >= 0; i --) {
if (i != 7)
printf(",");
printf("%s", ((x >> i) & 1) ? "true" : "false");
}
您可能会注意到,由于我从右到左对位进行编号,但您希望从左到右输出,因此循环索引必须递减。
请注意,根据 C 标准,unsigned char
至少 8 位但可能更多(如今,只有少数嵌入式 DSP 具有非 8 位的字符)。为了更加安全,请将其添加到代码的开头附近(作为顶级声明):
#include <limits.h>
#if CHAR_BIT != 8
#error I need 8-bit bytes!
#endif
如果目标系统恰好是那些特殊的嵌入式 DSP 之一,这将阻止编译成功。作为注释,C 标准中的术语“字节”表示“对应于 unsigned char
的基本存储单元”,因此,在 C 语言中,一个字节可能有超过八位(一个字节并不总是一个八位字节)。这是一个传统的混淆来源。
关于c - 在位层面上阅读字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2185719/
我是一名优秀的程序员,十分优秀!