请教bit和byte转换的问题

yiyamzen 2010-09-20 08:13:42
用C转换bit和byte的怎么做啊?
以下是我搜到的代码但是不知道什么意思,能不能给解释一下啊

unsigned char *bit2byte(unsigned char bit[8] , unsigned char byte[64])
{
int i=0 ;

for(i=0 ; i<=63 ; i++)
{
byte[i] = 0x0 ;//问题1:初始化为什么给字符类型赋值十六进制0?
}
for(i=0 ; i<=7 ; i++)
{//问题5:这样转换的原理能给说下吗?
if((bit[i] & 0x80) == 0x80) byte[i*8+0] = 0x01 ;//问题2:bit[i] & 0x80为什么要这样做,想得到什么?
if((bit[i] & 0x40) == 0x40) byte[i*8+1] = 0x01 ;//问题3:为什么要赋值十六进制01?
if((bit[i] & 0x20) == 0x20) byte[i*8+2] = 0x01 ;
//问题4:0x80 0x40 0x20 0x10 这8421是什么意思,貌似BCD码有8421的跟这个有关系吗?
if((bit[i] & 0x10) == 0x10) byte[i*8+3] = 0x01 ;
if((bit[i] & 0x08) == 0x08) byte[i*8+4] = 0x01 ;
if((bit[i] & 0x04) == 0x04) byte[i*8+5] = 0x01 ;
if((bit[i] & 0x02) == 0x02) byte[i*8+6] = 0x01 ;
if((bit[i] & 0x01) == 0x01) byte[i*8+7] = 0x01 ;
}
return byte;
}

//byte到bit是这样转的
unsigned char byte[64]
/*byte1*/
for(i = 0;i <= 7;i++)
{
if(byte[0] == 0x1) bit[0] = bit[0] | 0x80 ;//问题6:bit[0] | 0x80这样会得到什么,为什么这样做?
else bit[0] = bit[0] & 0x7f ;//问题7:bit[0] & 0x7f这样会得到什么,为什么这样做?
if(byte[1] == 0x1) bit[0] = bit[0] | 0x40 ;
else bit[0] = bit[0] & 0xbf ;
if(byte[2] == 0x1) bit[0] = bit[0] | 0x20 ;
else bit[0] = bit[0] & 0xdf ;
if(byte[3] == 0x1) bit[0] = bit[0] | 0x10 ;
else bit[0] = bit[0] & 0xef ;
if(byte[4] == 0x1) bit[0] = bit[0] | 0x08 ;
else bit[0] = bit[0] & 0xf7 ;
if(byte[5] == 0x1) bit[0] = bit[0] | 0x04 ;
else bit[0] = bit[0] & 0xfb ;
if(byte[6] == 0x1) bit[0] = bit[0] | 0x02 ;
else bit[0] = bit[0] & 0xfd ;
if(byte[7] == 0x1) bit[0] = bit[0] | 0x01 ;
else bit[0] = bit[0] & 0xfe ;
}
...全文
862 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
冬生0 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 truelance 的回复:]

unsigned char bit[8]: 有8个字节, 每个字节的8个bit都包含信息
unsigned char byte[64]: 有8个字节组,每个字节组8个字节,每个字节只包含1个bit信息
[/Quote]


byte 如何初始化
byte[]={E2,23,...,A1};不正确
Anubis_Sun 2010-09-20
  • 打赏
  • 举报
回复
学习。。。
yiyamzen 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xianglitian 的回复:]

byte[i] = 0x0 ;//问题1:初始化为什么给字符类型赋值十六进制0?
============
用十六进制是为了看着清楚
其实无所谓的
你也可以直接赋0
不过是针对位操作么
所以通过二进制的表示看的更清楚一些比如十进制的2对应10、4对应100
但二进制太长了所以就用十六进制表示了
----------------------------------
问题2:bit……
[/Quote]
非常感谢,你的解答很详细
yiyamzen 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 suchx 的回复:]

Byte has 8 bits b7b6b5b4b3b2b1
If byte is unsigned, then the value of Byte is
b7*2^7+b6*2^6+...+b1*2+b0
If byte is signed, then the value of Byte is
-b7*2^7+b6*2^6+b5*2^5+...+b1*2+b0
If you know……
[/Quote]
谢谢,好像有点明白了,我自己再研究研究^^
向立天 2010-09-20
  • 打赏
  • 举报
回复
byte[i] = 0x0 ;//问题1:初始化为什么给字符类型赋值十六进制0?
============
用十六进制是为了看着清楚
其实无所谓的
你也可以直接赋0
不过是针对位操作么
所以通过二进制的表示看的更清楚一些比如十进制的2对应10、4对应100
但二进制太长了所以就用十六进制表示了
----------------------------------
问题2:bit[i] & 0x80为什么要这样做,想得到什么?
===============================================
&是位与操作符也就是2进制的每一位进行与操作
0x80对应的二进制数是10000000
如果一个数比如11010011和0x80位与
那么结果就是10000000
如果一个数比如01110001和0x80位与
结果就是00000000
所以if((bit[i] & 0x80) == 0x80)就是判断第八位是不是1
以下的同理可推
------------------------------------
//问题3:为什么要赋值十六进制01?
================================
同问题1
参见问题2的回答可加深理解
------------------------------------
//问题4:0x80 0x40 0x20 0x10 这8421是什么意思,貌似BCD码有8421的跟这个有关系吗?
====================================
没什么大关系
翻译成二进制一目了然
0x80=10000000
0x40=1000000
0x20=100000
0x10=1000
参见问题2的回答可加深理解、
--------------------------------------------
//问题5:这样转换的原理能给说下吗?
===============================
参加问题2的解释
----------------------------------------------
//问题6:bit[0] | 0x80这样会得到什么,为什么这样做?
========================================
|是位或操作符也就是2进制的每一位进行或操作
比如一个数01100001与0x80位或
那么结果就是11100001
如果一个数11100001与0x80位或
那么结果就是11100001
可见bit[0] | 0x80操作就是将bit[0]的第八位置1
---------------------------------------------------
//问题7:bit[0] & 0x7f这样会得到什么,为什么这样做?
====================================
结合2、6的解释
bit[0] & 0x7f的操作是将第八位置0
以下操作同理
suchx 2010-09-20
  • 打赏
  • 举报
回复
Byte has 8 bits b7b6b5b4b3b2b1
If byte is unsigned, then the value of Byte is
b7*2^7+b6*2^6+...+b1*2+b0
If byte is signed, then the value of Byte is
-b7*2^7+b6*2^6+b5*2^5+...+b1*2+b0
If you know this, I think you can read the code with no problem.
For more information you can read Tang Hao Qiang's book or CSAPP.
yiyamzen 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 lcl_data 的回复:]

楼主仔细看看 字节在内存的排列就知道了,因为所有的操作都是微操作
[/Quote]
字节在内存内是怎么排序的呢?是分高位和地位来排的吗?这个貌似有点抽象不太好明白
能否给说明下呢?
yiyamzen 2010-09-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 l35633 的回复:]

byte[i] = 0x0 ;//问题1:初始化为什么给字符类型赋值十六进制0?
可以认为是8位的数据类型,不仅仅局限在字符类型,注意byte是字节的意思,不是字符

问题2:bit[i] & 0x80 位操作中的与操作0x80 = 1000 0000 二进制,为了得到高位数据
问题3:用十六进制看的比较明白而已,可以直接和二进制转换,当然你用10进制也行
问题4:对于操作本身……
[/Quote]
谢谢你的解答,不过只看明白了对于问题2的解释。-_-;;
对于那些或操作的目的还是不太清楚>_<
十八道胡同 2010-09-20
  • 打赏
  • 举报
回复
楼主仔细看看 字节在内存的排列就知道了,因为所有的操作都是微操作
十八道胡同 2010-09-20
  • 打赏
  • 举报
回复
{//问题5:这样转换的原理能给说下吗?

就是按照每一bit来转换,提取该bit的内容就用 & ,&是有1则1,
例如 a&0x80==0x80 ,那么他的最高位一定是1,
以此类推
  • 打赏
  • 举报
回复
byte[i] = 0x0 ;//问题1:初始化为什么给字符类型赋值十六进制0?
可以认为是8位的数据类型,不仅仅局限在字符类型,注意byte是字节的意思,不是字符

问题2:bit[i] & 0x80 位操作中的与操作0x80 = 1000 0000 二进制,为了得到高位数据
问题3:用十六进制看的比较明白而已,可以直接和二进制转换,当然你用10进制也行
问题4:对于操作本身来讲和8421没有关系,为什么会出现8421字样内,是因为都是按照2的权来设定的
问题5:先吧位操作搞清楚,自然就明白了
问题6:同问题2,是或操作
问题7:同问题2
熊熊大叔 2010-09-20
  • 打赏
  • 举报
回复
unsigned char bit[8]: 有8个字节, 每个字节的8个bit都包含信息
unsigned char byte[64]: 有8个字节组,每个字节组8个字节,每个字节只包含1个bit信息
  • 打赏
  • 举报
回复
[Quote=引用楼主 yiyamzen 的回复:]
用C转换bit和byte的怎么做啊?
以下是我搜到的代码但是不知道什么意思,能不能给解释一下啊

unsigned char *bit2byte(unsigned char bit[8] , unsigned char byte[64])
{
int i=0 ;

for(i=0 ; i<=63 ; i++)
{
byte[i] = 0x0 ;//问题1:初始化为什么给字……
[/Quote]

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧