C语言中如何提取出一个字节的八位各自的状态?
一个字节由八位组成,每位不是0就是1,可以表示8个逻辑状态,如何判断出一个字节的各位是0还是1,C语言中如何处理,请高手赐教。...
一个字节由八位组成,每位不是0就是1,可以表示8个逻辑状态,如何判断出一个字节的各位是0还是1,C语言中如何处理,请高手赐教。
展开
5个回答
展开全部
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。
不编程已好久,具体写法可能不正确,但思路没问题,谨供参考。
简单写一下:
位域用楼上的写法就行
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。
不编程已好久,具体写法可能不正确,但思路没问题,谨供参考。
展开全部
我不知道有没有直接的位运算算符能直接算出来,我自己印象是没有的。
其它的替代方法,我提供一种算法啊,把指向这个字节的那个指针强制转换成指向布尔型变量的指针,读出这个指针指向的数据,第一位出来了,指针自加1,再读,读出第二位,以此类推。。。。
问题是,我同样不记得C语言里怎么定义布尔变量。。。。
当然有种最笨的办法,指针类型强制转换为CHAR,再用%b(记不清楚,反正你就用格式化输出让它输出2进制格式就行)输出来。。。然后自己看吧。。。
其它的替代方法,我提供一种算法啊,把指向这个字节的那个指针强制转换成指向布尔型变量的指针,读出这个指针指向的数据,第一位出来了,指针自加1,再读,读出第二位,以此类推。。。。
问题是,我同样不记得C语言里怎么定义布尔变量。。。。
当然有种最笨的办法,指针类型强制转换为CHAR,再用%b(记不清楚,反正你就用格式化输出让它输出2进制格式就行)输出来。。。然后自己看吧。。。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
按位与.
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; // 最高位
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; // 最高位
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个是比较简单的办法:
通过构建数据结构来完成位操作,代码如下:
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);
}
通过构建数据结构来完成位操作,代码如下:
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);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
联合+位段
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询