C语言编程常见问题解答之位(bit)和字节(byte)
padding-top:> 位指的是二进制系统中的一位,它是最小的信息单位。位的用处可以从两方面去分析:第一,计算机对位的值可以有任意多种解释,例如表示"yes’’或"no”,或者表示磁盘是否已插入驱动器,或者表示某个鼠标键是否被按下;第二,将若干位的值连接起来后,就可以表示更复杂的数据,而且每|股票600279增加一位,可以表示的可能的值的数目就会增加一倍。
换句话说,一位可以表示两种可能的值,即“O”和“1”;两位可以表示2×2或4种可能的值,即“00”,“01”,“10”和“11”;类似地,三位可以表示2×2×2或8种可能的值……。对计算机来说,位的这种特性既是最有力的支持——因为很复杂的数据(例如本书内容)可以被分解为位的表示后存储起来,又是最大的限制——因为在现实生活中许多事物的值是不精确的,这样的值无法用数目有限的若干位来表示。
程序员始终必须清楚每一项数据需要用多少位来表示。因为位作为单位太小,所以为了方便起见,大多数计算机所处理的信息单位是被称为字节的位块。字节是大多数计算机中最小的可寻址的信息单位,这意味着计算机给每一个字节的信息都赋予一个地址,并且一次只能存取一个字节的信息。一个字节中的位的数目可以是任意的,并且在不同的计算机中可以不同。最常见的情况是每个字节中有8位,即可以存放256个不同的值。8位这样的长度非常适合于存放表示ASCII(the American Standard Code for Information Interchange)字符的数据。
下述程序可以显示空格符以后的ASCII字符和PC机的图形字符集:
# include
void main (void);
void main()
{
/" 601015股票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))
代替
#define 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)是相同的,只不过换了名称,从而使处理多位标163302基金净值志的宏名字风格保持一致。宏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的计算机按低位优先顺序存储32位的数。
1、嘉实货币一次性最少可买多少,两三个月会有收益吗? 货币型基金起步为1000元。以后追加500元即可。货币型基金是无风险、无手续费的,相当于银行定期存款,但是活期的进出、定期的利率。它是天天计息、月月计息,什么时候买都是一元面值。一般在...
2021601898股票年4月26日发(作者:历时不到一年,中国青旅实业发展有限责任公司(简称“中青旅)从日元汇率发展角度看人民币汇率问题屈长杰 李炵蒀【摘 要】摘要:2015年12月1日,国际货币基金组织正式宣600307股票 布把人民币...
1、国信证券股份有限公司的介绍 国信证券股份有限公司是全国性大型综合类证券公司,AA级证券公司,注册资本70亿元,在全国38个城市拥有54家营业网点,法定代表人为何如,现有员工9443人,其中公司本部员工1167人,本科以上学历人员占90...
上海机场股吧2021年4月26日发(作者:请教怎样在天天基金网上用活期宝买基金谢谢招商中证)深圳住房公积金贷款政策 住房公积金可以用来购房以及装修等,重要的是可以进行贷款。那么,深圳公积金贷款新政策有哪些?以下是小编为你整理的深圳住房公积金...
2021年4月26日发(作者:中国50大银行排行榜民生银行(600016)). 第一章 总 论 1.1项目概述 1.1.1项目名称:***二手车交易中心建设项目 1.1.2项目建设单位:***二手车交易有限公司 1.1.3项目地址:**...
白酒飘香 多股连创新高对于多只白酒股创新高,招商证券表示,市场当下仍是基于业绩确定性寻找投资机会,高端白酒相对于其他板块的确定性溢价开始凸显,基本面更具确定支撑,估值切换提前开启,奠定了股价新高的基础。华创证券表示,茅台自集团关联交易方案落...