资源描述:
《什么是按位或.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、什么是按位或,什么是按位异或,什么是按位与&按位与,
2、按位或,^按位异或AND(位与&)OR(位或
3、)XOR(位异或^)1&1=11&0=00&1=00&0=01
4、1=11
5、0=10
6、1=10
7、0=01^1=01^0=10^1=10^0=01.按位与运算按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0。参与运算的数以补码方式出现。例如:9&5可写算式如下:00001001(9的二进制补码)&00000101(5的二进制补码)00000001(1的二进制补码)可见9&5=1。按位与运算通
8、常用来对某些位清0或保留某些位。例如把a的高八位清0,保留低八位,可作a&255运算(255的二进制数为0000000011111111)。main(){inta=9,b=5,c;c=a&b;printf("a=%db=%dc=%d",a,b,c);}2.按位或运算按位或运算符“
9、”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。例如:9
10、5可写算式如下:00001001
11、0000010100001101(十进制为13)可见9
12、5=13main(){inta=9,b
13、=5,c;c=a
14、b;printf("a=%db=%dc=%d",a,b,c);}3.按位异或运算按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如9^5可写成算式如下:00001001^0000010100001100(十进制为12)main(){inta=9;1. 位运算整数在计算机中用二进制的位来表示,C语言提供一些运算符可以直接操作整数中的位,称为位运算,这些运算符的操作数都必须是整型的。1.1. 按位与、或、异或、取反运算在第 3 节“布尔代数”讲过逻
15、辑与、或、非运算,并列出了真值表,对于整数中的位也可以做与、或、非运算,C语言提供了按位与(BitwiseAND)运算符&、按位或(BitwiseOR)运算符
16、和按位取反(BitwiseNOT)运算符~,此外还有按位异或(BitwiseXOR)运算符^,下面用二进制的形式举几个例子。图 16.1. 位运算注意,&、
17、、^运算符都是要做UsualArithmeticConversion的(其中有一步是IntegerPromotion),~运算符也要做IntegerPromotion,所以在C语言中其实并不存在8位整数的位运算,操作数在做位运算之前都至少被提升为in
18、t型了,上面用8位整数举例只是为了书写方便。比如:unsignedcharc=0xfc;unsignedinti=~c;计算过程是这样的:常量0xfc是int型的,赋给c要转成unsignedchar,值不变;c的十六进制表示是fc,计算~c时先提升为整型(000000fc)然后取反,最后结果是ffffff03。注意,如果把~c看成是8位整数的取反,最后结果就得3了,这就错了。为了避免出错,一是尽量避免不同类型之间的赋值,二是每一步计算都要按上一章讲的类型转换规则仔细检查。1.2. 移位运算移位运算符(BitwiseShift)包括左移<<和右移>>。左移将一个
19、整数的各二进制位全部左移若干位,例如0xcfffffff3<<2得到0x3fffffcc:图 16.2. 左移运算最高两位的11被移出去了,最低两位又补了两个0,其它位依次左移两位。但要注意,移动的位数必须小于左操作数的总位数,比如上面的例子,左边是unsignedint型,如果左移的位数大于等于32位,则结果是Undefined。移位运算符不同于+-*/==等运算符,两边操作数的类型不要求一致,但两边操作数都要做IntegerPromotion,整个表达式的类型和左操作数提升后的类型相同。在一定的取值范围内,将一个整数左移1位相当于乘以2。比如二进制11(十进
20、制3)左移一位变成110,就是6,再左移一位变成1100,就是12。读者可以自己验证这条规律对有符号数和无符号数都成立,对负数也成立。当然,如果左移改变了最高位(符号位),那么结果肯定不是乘以2了,所以我加了个前提“在一定的取值范围内”。由于计算机做移位比做乘法快得多,编译器可以利用这一点做优化,比如看到源代码中有i*8,可以编译成移位指令而不是乘法指令。当操作数是无符号数时,右移运算的规则和左移类似,例如0xcfffffff3>>2得到0x33fffffc:图 16.3. 右移运算最低两位的11被移出去了,最高两位又补了两个0,其它位依次右移两位。和左移类似,
21、移动的位数也必须小于左操