位运算符的应用

来源:互联网 发布:威廉玛丽学院 知乎 编辑:程序博客网 时间:2024/04/27 18:46

1.按位与运算 按位与运算符"&"是双目运算符。其功能是参与运算的两数各对应的二进位相与。规律是:只有对应的两个二进位均为1时,结果才为1,否则为0参与运算的数以补码形式出现。例如:

9&5即00001001(9的二进制补码)&00000101(5的二进制补码)得00000001(1的二进制补码)可见9&5=1

按位与运算通常用于清0或保留定位,例如把a的高八位清0,保留低八位,可以做a&255的运算(255二进制数为0000000011111111)

应用:

a. 清零特定位 (mask中特定位置0,其它位为1s=s&mask)

b. 取某数中指定位 (mask中特定位置1,其它位为0s=s&mask)

 

 

2. 按位或运算 按位或运算符|是双目运算符。其功能是参与运算的两数各对应的二进位相或。规律是:只要对应的二个二进位有一个为1时,结果位就为1参与运算的两个数均以补码出现

 

例如:9|5可写算式如下:

00001001|00000101

00001101 (十进制为13)可见9|5=13

 

 

应用:

常用来将源操作数特定位置变为1,其它位不变。 (mask中特定位置1,其它位为0 s=s|mask)

 

3. 按位异或运算 按位异或运算符^是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1(即“异性相吸为一”)参与运算数仍以补码出现

例如9^5可写成算式如下:

   00001001^00000101 00001100 (十进制为12)

 

应用:

  a. 使特定位的值取反 (mask中特定位置为1,其它位为0 s=s^mask)

b. 不引入第三变量,交换两个变量的值

int a=10,b=12;//a=1010,b=1100;

a=a^b;//a=0110,b=1100;

   b=a^b;//a=0110,b=1010;

a=a^b;//a=1100,b=1010;

(此算法能够时间是由于异或运算特点决定的,任意一个数与任意一个给定的值连续异或两次,值不变即a^b^b=a)

4. 求反运算

 

求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。例如~9的运算为: ~(0000000000001001)结果为:1111111111110110

需注意对负数取反,要使用补码的形式表示,如~-9(原码:10001001->反码:11110110->补码:11110111->~-9:00001000即8)补码=反码+1;

 

5. 左移运算

 

   左移运算符<<是双目运算符。其功能把<< 左边的运算数的各二进位全部左移若干位,<<右边的数指定移动的位数, 高位丢弃,低位补0 其值相当于乘2例如: a<<4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)

 

6. 右移运算

 

右移运算符>>是双目运算符。其功能是把>> 左边的运算数的各二进位全部右移若干位,>>右边的数指定移动的位数。其值相当于除2

 

例如:设 a=15a>>2 表示把000001111右移为00000011(十进制3)对于左边移出的空位,如果是正数则空位补0,若为负数,可能补0或补1,这取决于所用的计算机系统。移入0的叫逻辑右移(在Java里用>>>表示),移入1的叫算术右移

Turbo C采用逻辑右移。

main(){

unsigned a,b;

printf("input a number: ");

scanf("%d",&a);

b=a>>5;//在编程过程中经常忘记赋值语句,而直接写作a>>5,单这样写其实的值没发生变化

b=b&15;

printf("a=%d b=%d ",a,b);

}