位运算符
一、图表
位运算符
描述
&
按位与
|
按位或
^
按位异或
~
取反
<<
左移
>>
右移
说明:在位运算符中,除~以外,均为双目(元)运算符,及要求两侧各有一个运算量;且运算量只能是整型或字符型的数据,不能为实型数据。
二、按位与
1、“&”,双目运算符,其功能是参与运算的两数个对应的二进位相与。只有对应的两个二进位为1时,其值为1;否则皆为0.
例如:1&1=1,1&0=0,0&0=0;
2、计算
10&7=2
二进制为:
10=0000 1010,7=0000 0111;
0000 1010
& 0000 0111
0000 0010=2
3、按位与的作用
通常用来对某些位清0或保留某些位。
例如:有一个数时0110 1101,希望保留从右边开始第三四位:
0110 1101
& 0000 1100
0000 1100
总结:
- 想保留的那几位都为0,那除这几位外,皆为0,这几位为1或0皆可。
- 想保留的那几位都为1,那除这几位外,皆为0,这几位只能为1。
- 想保留的那几位有1和0,那除这几位外,皆为0,这几位,为1的取1,其它取0.
三、按位或
1、“|”,双目运算符,其功能是参与运算的两数各对应的二进位相或。只要对应的两个二进位有一个为1,其值为1,否则皆为0.
0|0=0,0|1=1,1|1=1
2、计算:6|2=6
二进制为:
6=0000 0110,2=0000 0010
0000 0110
| 0000 0010
0000 0110
常用来让源操作数的某些位置为1,其它位不变。
四、按位异或
1、“^”,双目运算符,其功能是参与运算的两数各对应的二进位相异或;当两对应的二进位相异时,结果为1.
0^0=0,0^1=0,1^1=0;
2、计算:10^5=15
二进制:10=0000 1010,5=0000 0101
0000 1010
^ 0000 0101
0000 1111
充分利用按位异或的特性,可以实现以下效果:
- 设置一个二进制掩码mask,执行s=s^mask,设置特定位置是1,可以使特定位的值取反;设置掩码中特定位置的其它位是0,可以保留原值。
设有0111 1010,想使其低四位反转,即1变0,0变1.可将它与0000 1111进行^运算。
- 不引入第三变量,交换两变量的值。想将a,b的值互换,可以用以下语句:
a=a^b;
b=b^a;
a=a^b;
五、按位取反
“~”,单目运算符,具有右结合性,其功能是对参与运算的数的各二进位按位求反。
例如:~9的运算为~(0000 1001),结果为1111 0110;
六、左移运算符
1、“<<”,双目运算符,功能:把“<<”左边运算数的各二进位全部左移若干位,由“<<”右边的数指定移动的位数。
无符号数:是针对二进制
来讲的,无符号数的表数范围是非负数
;全部二进制均代表数值,没有符号位。即第一个"0"或"1"来表示正负。
通俗来说,就是整串数左移,高位的不要,低位补0
2、计算:
n=1;二进制为:0000 0001
n<<2: 0000 0001——>0000 0100=4
n<<6: 0000 0001——>0100 0000=6
n=128; 二进制为:1000 0000
n<<1; 1000 0000——>0000 0000
注意:左移一位相当于该数乘以2,但此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况。这里就出现了溢出现象,如果数据最高位和符号位不同的话,说明这个数字的绝对值已经超过 64 了,那么左移一位后必然溢出。所以一个【有效的】左移最高位和数据最高位必然一致。故算术左移和逻辑左移一样。
溢出和计算结果不正确是两码事。
七、右移运算符
1、“>>”,双目运算符,功能:把“>>”左边运算数的各二进位全部右移若干位,由“>>”右边的数指定移动的位数。
通俗来说,就是整串数右移,高位补0,低位不要。
2、计算:
n=2;二进制:0000 0010
n<<1: 0000 0010——>0000 0001=1
其原理与左移类似。