C语言中如何提取出一个字节的八位各自的状态?

2025-01-01 10:00:46
推荐回答(5个)
回答1:

Port I/O操作常用写法:定义8个位域,并且和一个Char放到联合体中。

简单写一下:

位域用楼上的写法就行

union {
_aaa testBit;
unsigned char ucTestByte;
} P1;

首先把字节整体赋值,比如0xAA。
P1.ucTestByte = 0xAA;

则可直接使用各Bit进行判断,如:
if ( P1.testBit.a1 == 0 ) {
.....;
}

当然也可以直接对某一位赋值,如:
P1.testBit.a1 = 0;
则P1.ucTestByte变成0xAB;

位域不建议定义成a1-a8,最好是a0-a7,或bit0-bit7。

不编程已好久,具体写法可能不正确,但思路没问题,谨供参考。

回答2:

我不知道有没有直接的位运算算符能直接算出来,我自己印象是没有的。

其它的替代方法,我提供一种算法啊,把指向这个字节的那个指针强制转换成指向布尔型变量的指针,读出这个指针指向的数据,第一位出来了,指针自加1,再读,读出第二位,以此类推。。。。

问题是,我同样不记得C语言里怎么定义布尔变量。。。。

当然有种最笨的办法,指针类型强制转换为CHAR,再用%b(记不清楚,反正你就用格式化输出让它输出2进制格式就行)输出来。。。然后自己看吧。。。

回答3:

按位与.

unsigned char a;
int r[8];

r[0] = a & 0x01; // 最低位
r[1] = ( a & 0x02) >> 1;
r[2] = ( a & 0x04) >> 2;
r[3] = ( a & 0x08) >> 3;
r[4] = ( a & 0x10) >> 4;
r[5] = ( a & 0x20) >> 5;
r[6] = ( a & 0x40) >> 6;
r[7] = ( a & 0x80) >> 7; // 最高位

回答4:

这个是比较简单的办法:
通过构建数据结构来完成位操作,代码如下:

typedef struct _aaa
{
unsigned char a1 :1;
unsigned char a2 :1;
unsigned char a3 :1;
unsigned char a4 :1;
unsigned char a5 :1;
unsigned char a6 :1;
unsigned char a7 :1;
unsigned char a8 :1;
}aaa;
main()
{
unsigned char b;
b=60;
printf("%d,%d,%d,%d,%d,%d,%d,%d",((aaa *)&b)->a8,((aaa *)&b)->a7,((aaa *)&b)->a6,((aaa *)&b)->a5,((aaa *)&b)->a4,((aaa *)&b)->a3,((aaa *)&b)->a2,((aaa *)&b)->a1);
}

回答5:

联合+位段