还剩4页未读,继续阅读
文本内容:
位运算所谓位运算,就是对一个比特(Bit)位进行操作在《二进制思想以及数据的存储》一节中讲到,比特(Bit)是一个电子元器件,8个比特构成一个字节(Byte),它已经是粒度最小的可操作单元了语言提供了六种位运算符C运算符1«»八说明按位与按位或按位异或取反左移右移按位与运算()L一个比特(Bit)位只有0和1两个取值,只有参与运算的两个位都为1时,结果才为b否则为例如为为也为这和逻辑运算符非常类似0111,000,100,语言中不能直接使用二进制,两边的操作数可以是十进制、八进制、十六进制,它们在C内存中最终都是以二进制形式存储,就是对这些内存中的二进制位进行运算其他的位运算符也是相同的道理例如,可以转换成如下的运算95(在内存中的存储)00000000—00000000—00000000—000010019(在内存中的存储)00000000—00000000—00000000—000001015(在内存中的存储)00000000—00000000—00000000—000000011也就是说,按位与运算会对参与运算的两个数的所有二进制位进行运算,的结果为951又如,可以转换成如下的运算-95(在内存中的存储)11111111—11111111—11111111—11110111-9(在内存中的存储)00000000—00000000—00000000—000001015(在内存中的存储)00000000—00000000—00000000—000001015的结果是-955o关于正数和负数在内存中的存储形式,我们已在教程《整数在内存中是如何存储的》中VIP进行了讲解再强调一遍,是根据内存中的二进制位进行运算的,而不是数据的二进制形式;其他位运算符也一样以-为例,的在内存中的存储和的二进制形式截然不同95-9-9(在内存中的存储)11111111—11111111—11111111—11110111-9(的二进制形式,前面多余-00000000—00000000—00000000—00001001-9的可以抹掉)0按位与运算通常用来对某些位清或者保留某些位例如要把的高位清保留低0,n160,16位可以进行运算在内存中的存储形式为,n0XFFFF0XFFFF00000000~00000000—11111111—11111111o【实例】对上面的分析进行检验
1.#include stdio.h
2.
3.int main{
4.int n=0X8FA6002D;
5.printf,z%d,%d,%X\n〃,95,-95,nOXFFFF;
6.return0;
7.}运行结果1,5,2D按位或运算(|)
2.参与运算的两个二进制位有一个为时,结果就为两个都为时结果才为例如为I11,00o111为为这和逻辑运算中的非常类似1,0|00,1|01,II例如,可以转换成如下的运算9|500000000—00000000—00000000—00001001I00000000—(9在内存中的存储)00000000—00000000—00000101(5在内存中的存储)(在内存中的存储)00000000—00000000—00000000—0000110113的结果为9|513又如,可以转换成如下的运算-9|5(在内存中的存储)11111111—11111111—11111111—11110111-9(在内存中的存储)|00000000—00000000—00000000—000001015(在内存中的存储)11111111—11111111—11111111—11110111-9的结果是-9|5-9按位或运算可以用来将某些位置或者保留某些位例如要把的高位置保留低位,1,n161,16可以进行n|OXFFFFOOOO运算(OXFFFFOOOO在内存中的存储形式为11111111—11111111)—00000000—00000000o【实例】对上面的分析进行校验#include stdio.h
1.
2.()
3.int main{
4.int n=0X2D;〃,)
5.printf C%d,%d,%X\n9|5,-9|5,n|OXFFFFOOOO;
6.return0;)
7.运行结果13,-9,FFFF002D按位异或运算)
3.L参与八运算两个二进制位不同时,结果为相同时结果为例如为(为为1,Oo011,T0o,ri0例如,可以转换成如下的运算9-5(在内存中的存储)00000000—00000000—00000000—000010019(在内存中的存储)-00000000—00000000—00000000—000001015(在内存中的存储)00000000~00000000~00000000~0000110012的结果为9-512又如,可以转换成如下的运算-9-5(在内存中的存储)11111111~11111111~11111111~11110111-9(在内存中的存储)-00000000—00000000—00000000—000001015(在内存中的存储)11111111—11111111—11111111—11110010-14的结果是-9-5-14o按位异或运算可以用来将某些二进制位反转例如要把的高位反转,保留低位,可以n1616进行运算(在内存中的存储形式为n,OXFFFFOOOO OXFFFFOOOO11111111—11111111~0000)0000~00000000o【实例】对上面的分析进行校验
1.#include stdio.h
2.()
3.int main{
4.unsigned n=0X0A07002D;〃,八八)
5.printf%d,%X\n9-5,-95,n OXFFFFOOOO;
6.return0;)
7.运行结果12,-14,F5F8002D取反运算(~)
4.取反运算符~为单目运算符,右结合性,作用是对参与运算的二进制位取反例如为0,~0为这和逻辑运算中的!非常类似1,例如,可以转换为如下的运算~9(在内存中的存储)~00000000—00000000—00000000—000010019(在内存中的存储)11111111—11111111—11111111—11110110-10所以的结果为〜9-10o例如,可以转换为如下的运算〜-9(在内存中的存储)~11111111—11111111—11111111—11110111-9(在内存中的存储)00000000—00000000—00000000—000010009所以、的结果为-98o【实例】对上面的分析进行校验
1.#inc1ude stdio.h
2.()
3.int main{〃,)
4.printf%d\n~9,~-9;
5.return0;
6.}运行结果-10,8左移运算(«)
5.左移运算符用来把操作数的各个二进制位全部左移若干位,高位丢弃,低位补0例如,可以转换为如下的运算93(在内存中的存储)«00000000—00000000—00000000—000010019(在内存中的存储)00000000—00000000—00000000—0100100072所以的结果为9«372o又如,(-)可以转换为如下的运算9«3«mi mi—mi1111—1111mi—mi om(-9在内存中的存储)mi mi-mi mi-mi mi-ion woo(-72在内存中的存储)所以(-)的结果为9«3-72如果数据较小,被丢弃的高位不包含那么左移位相当于乘以的次方1,n2n【实例】对上面的结果进行校验
1.#include stdio.h
2.()
3.int main{〃,())
4.printf C%d,%d\n9«3,9«3;
5.return0;)
6.运行结果72,-72移运算(»)
6.
1.右移运算符》用来把操作数的各个二进制位全部右移若干位,低位丢弃,高位补或如果0lo数据的最高位是0,那么就补0;如果最高位是1,那么就补1例如,可以转换为如下的运算93(在内存中的存储)»00000000~00000000~00000000—000010019(在内存中的存储)00000000—00000000—00000000—000000011所以的结果为9»3lo又如,(-)可以转换为如下的运算93(在内存中的存储)»11111111—11111111—11111111—11110111-9(在内存中的存储)11111111—11111111—11111111—11111110-2所以(-9)〉3的结果为-2如果被丢弃的低位不包含那么右移位相当于除以的次方(但被移除的位中经常会包1,n2n含)1o【实例】对上面的结果进行校验
1.#include stdio.h
2.()
3.int main{
4.printf(/z%d,%d\n〃,9»3,(-9)»3);
5.return0;
6.运行结果1,-2。
个人认证
优秀文档
获得点赞 0