C语言里所有的位运算都是指二进制数的位运算。即使输入的是十进制的数,在内存中也是
存储为二进制形式。
1.
左移运算符“< <”用法:
(左移运算是将一个二进制的操作数按指定移动的位数向左移位,移出位被丢弃,右边的空位一律补0)
格式是:a<<m, a和m必须是整型表达式,要求m>=0。
功能:将整型数a按二进制位向左移动m位,高位移出后,低位补0。
右移运算符“> >”用法:
(右移运算是按指定移动位数向右移动,移出位被丢弃,左边移动的空位一律补0)
格式是:a>>m, a和m必须是整型表达式,要求m>=0。
功能:将整型数a按二进制位向右移动m位,高位移出后,低位补0。
对于无符号数,进行右移时,左边空出的部分补0.
对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0;
而为负数时,符号位为1,最高位是补0或是补1取决于编译系统的规定。
Turbo C和很多系统规定为补1。
2.
C语言8进制移位计算
八进制数177777>>2
无符号数结果是037777
(例如无符号的177777转换成二进制是001 111 111 111 111 111,右移两位是
000 011 111 111 111 111,再转换成八进制就是037777)
有符号数结果是637777
(有符号的时候,右移两位补充1,110 011 111 111 111 111,转换成八进制就是637777)
3.
C语言中,移位表示什么?有什么用?
比较浅显的说来,左移n位就是乘以2的n次方,右移n位就是除以2的n次方,具体细节如下:
先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符,例如:
int i = 1;
i = i<<2;//把i里的值左移2位
(也就是说,1的二进制是0000 0001,左移2位之后变成0000 0100,也就是十进制的4,所以
左移1位就是乘以2,那么左移n位就是乘以2的n次方)(有符号数不完全适用,因为左移有可能导致符号变化)
需要注意的一个问题是:int类型最左端的符号位和移出去的情况,我们知道,int 是有符号的整型数,
最左端的1位是符号位,即0正1负,那么移位的时候就会出现溢出,例如:
int i = 0x40000000;//16进制的4000 0000,为二进制的0100 0000 0000 0000 0000 0000 0000 0000
//4000 0000共八位,故用二进制表示为32位。
i = i<<1;
那么,i在左移1位之后就会变成0x40000000,也就是二进制的1000 0000 0000 0000 0000 0000 0000 0000
待补充右移运算。
因为位移运算的速度比乘法快很多,所以在处理数据的乘法或除法运算数字(当要乘或除的数字是2的次方时候,采用
位移运算可以获得较快的运算速度,提高程序的运行效率)。
4.与运算 &:
两个都为1,才为1;
或运算 |:
一个为1,就为1;
异或运算 ^:
同为0,异为1;
(异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:
0异或0=0,1异或 0=1,0异或1=1,1异或1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位);
运算规则如下:
0&0 = 0; 0|0= 0; 0^0 = 0;
0&1 = 0; 0|1= 1; 0^1 = 1;
1&0 = 0; 1|0= 1; 1^0 = 1;
1&1 = 1; 1|1= 1; 1^1 = 0;