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;