C语言编程常见问题解答之位(bit)和字节(byte)
padding-top:> 位指的是二进制系统中的一位,它是最小的信息单位。位的用处可以从两方面去分析:第一,计算机对位的值可以有任意多种解释,例如表示"yes’’或"no”,或者表示磁盘是否已插入驱动器,或者表示某个鼠标键是否被按下;第二,将若干位的值连接起来后,就可以表示更复杂的数据,而且每|股票600279增加一位,可以表示的可能的值的数目就会增加一倍。
换句话说,一位可以表示两种可能的值,即“O”和“1”;两位可以表示2×2或4种可能的值,即“00”,“01”,“10”和“11”;类似地,三位可以表示2×2×2或8种可能的值……。对计算机来说,位的这种特性既是最有力的支持——因为很复杂的数据(例002262股票 如本书内容)可以被分解为位的表示后存储起来,又是最大的限制——因为在现实生活中许多事物的值是不精确的,这样的值无法用数目有限的若干位来表示。
程序员始终必须清楚每一项数据需要用多少位来表示。因为位作为单位太小,所以为了方便起见,大多数计算机所处理的信息单位是被称为字节的位块。字节是大多数计算机中最小的可寻址的信息单位,这意味着计算机给每一个字节的信息都赋予一个地址,并且一次只能存取一个字节的信息。一个字节中的位的数目可以是任意的,并且在不同的计算机中可以不同。最常见的情况是每个字节中有8位,即可以存放256个不同的值。8位这样的长度非常适合于存放表示ASCII(the American Standard Code for 兴业矿业股吧Information Interchange)字符的数据。
下述程序可以显示空格符以后的ASCII字符和PC机的图形字符集:
# 张磊博客 include
void main (void);
void main()
{
/" Display ASCII char set " /
unsigned char space=''
int test_nbr=10;
printf("Starting character=%c
" , ascii_char);
/" The 5th bit position determines if the character is
uppercase or lowercase.
5th bit=0 - Uppercase
5th bit=1- Lowercase * /
printf ("
Turn 5th bit on=%c
" , SET_FLAG(ascii_char, 网易股票代码BIT_POS(5)));
printf ("Turn 5th bit off=%c
",CLR_FLAG(ascii_char, BIT_POS(5)));
printf ("Look at shifting bits
");
printf ("================
" );
printf ("Current value=%d
" , test_nbr)i
printf ("Shifting one position left=%d
" ,
test_nbr=BIT_SHIFTL(test_nbr, 1) );
printf ("Shifting two positions right=%d
"权威配资世界 ,
BIT_SHIFTR(test_nbr, 2) );
}
宏BIT_POS(N)能返回一个和N指定的位对应的屏蔽字(例如BIT_POS(O)和BIT_POS(1)分别返回最低位和倒数第二位的屏蔽字),因此你可以用
#define A_FLAG BIT_POS(12)
#define A_FLAG BIT_P0S(13)
代替
#define A_FLAG 4096
#define A_FLAG 8192
这样可以降低出错的可能性。
宏SET_FLAG(N,F)能置位变量N中由值F指定的位,而宏CLR_FLAG(N,F)则刚好相反,它能清除变量N中由值F指定的位。宏TST_FLAG(N,F)可用来测试变量N中由值F指定的位,例如:
if (TST_FLAG (flags, A_FLAG))
代替
#股票000526define FIRST_OCTAL_DIGIT 7
#define SECOND_OCTAL_DIGIT 56
# define C-RED ?BIT_SHIFTL(1,8) ?
# define C-GREEN ?BIT_SHIFTL(2,8)?
# define C-BLUE BIT-SHIFTL(3,8)
# define C_WHITE BIT-SHIFTL(4,8)
# defineC-ZERO?C-BLACK
# defineC-LARGEST?C-WHITE
?
#if C_LARGEST > 铁路板块 C_FLAG
Cause an error message. The flag C_FLAG is not
big enough to hold all its possible values.
#endif
宏SET_MFLAG(N,F,V)先清除变量N中由值F指定的位,然后置位变量N中由值V指定的位。宏CLR_MFLAG(N,F)的作用和CLR_FLAG(N,F)是相同的,只不过换了名称,从而使处理多位标志的宏名字风格保持一致。宏GET_MFLAG(N,F)能提取变量N中标志F的值,因此可用来测试该值,例如:
if (GET_MFLAG(flags, C_FLAG)==C_BLUE)
;
注意:宏BIT_RANGE()和SET_MFLAG()对参数N都引用了两次,因此语句
SET_MFLAG(*x++,C_FLAG,C_RED);
的行为是没有定义的,并且很可能会导致灾难性的后果。 北大荒股吧 请参见:
10.1 用什么方法存储标志(flag)效率最高?
10.3 位域(bit fields)是可移植的吗? 10.3位域(bit fields)是可移植的吗?
位域是不可移植的。因为位域不能跨越机器字,而且不同计算机中的机器字长也不同,所以一个使用了位域的程序在另一种计算机上很可能无法编译。
假设你的程序能在另一种计算机上编译,将位分配给位域时所遵循的顺序仍然是没有定义的。因此,不同的编译程序,甚至同一编译程序的不同版本所产生的代码,很可能无法在由原来的编译程序所生成的数据上工作。通常应该避免使用位域,除非计算机能直接寻址内存中的位并且编译程序产生的代码能利用这种功能,并且由此而提高的速度对程序的性能是至关|湖南禽流感重要的。
请参见:
10.1 用什么方法存储标志(flag)效率最高?
10.2 什么是“位屏蔽(bit masking)”?
10.4 移位和乘以2这两种方式中哪一种更好?
不管你采用哪种方式,任何合格的优化编译程序都会产生相同的代码,因此你可以采用使
程序的上下文更易读的那种方式。你可以用DOS/Windows上的CODEVIEW或UNIX机上
的反汇编程序(通常被称为"dis”)这样的工具来查看下述程序的汇编代码:
例10.4乘以2和左移一位经常是相同的
void main()
{
unsigned int test_nbr=300;
test_nbr *=2;
test_nbr=300;
是低位优先顺序。和存储16位的数一样,大多数计算机按高位优先顺序存储32位的数,但基于Intel CPU的计算机按低位优先510300 顺序存储32位的数。
2021年4月26日发(作者:咱就是套进去垫背的[哭]汇丰晋信龙腾混合(of540002))2020车险新政改革后,车险保费降了吗? 车险新规已经出来一段时间了,不知道大家有没有做过对比,今天小编和大家聊下车险新政变化: 9月3日,《关于实...
股票知识讲座视频002111股吧2021年4月27日发(作者:天津贵金属交易所组织内幕大全沪金(fshfeau))北京现代领翔自动变速器 作者:阿伦 作者机构:(Missing) 来源:汽车与驾驶维修:维修版 ISSN:1004-28360...
天然气涨价|股票0021072021年4月28日发(作者冠农股份股吧 :学生奶粉排行榜10强荷兰乳牛生产工艺严谨可信赖申华控股)极目楚天舒坤哥【期刊名称】《中国农资》六国化工股票 【年(卷),期】2011(000)043【摘要】与一帮友人沟...
|煤炭股票股票600058基金鸿阳2021年4月28日发(作002171股吧者:666国产大奶徐自力奶水充足2525罗牛山(000735))中兴通讯(000063) 漳泽电力股票面临全新的发展机遇 作者:陈运红; 作者机构:国金证券; 来...
2021年4月26日发(作者:市场招聘总经理谷奕伟离任引发张江高科治理争议张江高科)页眉内容 五行最新报道:郭树清新政120天 改革之“剑”挥斩股市多个顽疾 从2011年10月29日,郭树清正式履新证监会主席,至昨日整整122天。“资本市场...
修正药业股票代码冠农股份股票2021年4月27日发(作者:日内交易论坛停发新股了高争民爆(002827))microRNA、美股蒸发17万亿 mRNA及lncRNA在动脉粥样硬化中的|青鸟华光作用 同花顺股民学校作者:|股票601766姜勇...