位运算

1、概览

算数位移和逻辑位移

逻辑位移是移动数字的所有物理比特位。

算数位移是对数字除了符号位以外的比特位进行位移,符号位保持不变

在java语言中,使用>>>表示逻辑位移,使用>>表示算数位移,所以即使是有符号数,也可以做逻辑位移
在C语言中,只有>>表示位移。对于有符号数,通常(但不是绝对)使用的是算数位移。

“无符号数就是逻辑,有符号数就是算数”,这个推论是不严谨的。虽然绝大多数情况下是正确的。

2、与运算(&)

运算:0&0=0;0&1=0;1&0=0;1&1=1

总结:两个同时为1,运算后值为1,否则为0。

用途:

1)将最右边的1变成0

(n−1): 二进制数字 n 最右边的 1 变成 0 ,此 1 右边的 0 都变成 1 。
n&(n−1): 二进制数字 n 最右边的 1 变成 0 ,其余不变。

2)清零

与一个各位都为零的数值相与,结果为零。

3)判断奇偶

只要根据最未位是0还是1来决定,为0就是偶数,为1就是奇数。因此可以用if ((a & 1) == 0)代替if (a % 2 == 0)来判断a是不是偶数。

3、或运算(|)

运算:0|0=0;0|1=1;1|0=1;1|1=1

总结:其中一个为1,运算后值为1,否则为0。

4、异或运算(^)

运算:0^0=0;0^1=1;1^0=1;1^1=0

总结:两个不一样时,运算后值为1,否则为0。

异或的几条性质:

1)交换律。a ^= b;b ^= a;a ^= b;

2)结合律 (ab)c == a(bc)

3)对于任何数x,都有 xx=0(两个相同数异或值为零),x0=x(与0相异或值不变)

4)自反性: abb=a^0=a;

5、取反运算(~)

运算:1=0;0=1

总结:0变1,1变0

用途:使一个数的最低位为零

使a的最低位为0,可以表示为:a & 1。1的值为 1111 1111 1111 1110,再按"与"运算,最低位一定为0。因为“ ~”运算符的优先级比算术运算符、关系运算符、逻辑运算符和其他运算符都高。

6、左移运算(<<)

定义:将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。

设 a=1010 1101,a = a<< 2 将a的二进制位左移2位、右补0,即得a=1011 0100。

若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。

7、右移运算(>>)

定义:将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。

例如:a=a>>2 将a的二进制位右移2位,左补0 或者 左补1得看被移数是正还是负。

操作数每右移一位,相当于该数除以2。

posted @ 2021-02-20 10:56  kanie_life  阅读(88)  评论(0)    收藏  举报