您的位置:首页 > 其它

位运算符

2016-05-09 17:18 260 查看
原码:就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。

反码:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

补码:正数的补码与其原码相同;负数的补码是在其反码的末位加1。

计算机表示出来的是原码,在内存中参与计算的是补码。

                                                                                                                   位运算符

运算符

运算

范例

<<

左移

3 << 2 = 12 --> 3*2*2=12

>>

右移

3 >> 1 = 1  --> 3/2=1

>>>

无符号右移

3 >>> 1 = 1 --> 3/2=1

&

与运算

6 & 3 = 2

|

或运算

6 | 3 = 7

^

异或运算

6 ^ 3 = 5

~

反码

~6 = -7


1.   按位与运算&

任何二进制位和0进行&运算,结果是0;和1进行&运算结果是原值。(有0则0)

int a=10;
int b=20;
System.out.println(a&b);
* a=10 的二进制是:00000000 00000000 00000000 00001010
* b=20 的二进制是:00000000 00000000 00000000 00010100
* 00000000 00000000 00000000 00001010
* &
* 00000000 00000000 00000000 00010100
* -------------------------------------------
* 00000000 00000000 00000000 00000000
* 结果是:0




2.   按位或运算|

任何二进制位和0进行 | 运算,结果是原值;和1进行 | 运算结果是1。(有1则1)

int a=10;
int b=20;
System.out.println(a|b);
* a=10 的二进制是:00000000 00000000 00000000 00001010
*
* b=20 的二进制是:00000000 00000000 00000000 00010100
*
* 00000000 00000000 00000000 00001010
* |
* 00000000 00000000 00000000 00010100
* -------------------------------------------
* 00000000 00000000 00000000 00011110
* 结果是: 30



3.按位异或运算 ^

任何相同二进制位进行 ^ 运算,结果是0;不相同二进制位 ^ 运算结果是1。(相同则0,不同则1)

int a=10;
int b=20;
System.out.println(a^b);
* a=10 的二进制是:00000000 00000000 00000000 00001010
*
* b=20 的二进制是:00000000 00000000 00000000 00010100
*
* 00000000 00000000 00000000 00001010
* ^
* 00000000 00000000 00000000 00010100
* -------------------------------------------
* 00000000 00000000 00000000 00011110
* 结果是: 30



4.   求反运算~

二进制位进行 ~ 运算 ,1变0,0变1

int a=10;
System.out.println(~a);
* 00000000 00000000 00000000 00001010
* ~
* -------------------------------------------
* 11111111 11111111 11111111 11110101 补码
* 11111111 11111111 11111111 11110100 反码
* 10000000 00000000 00000000 00001011 原码
* 结果是:10



5.   左移运算<<

空位补0,被移除的高位丢弃。

int a=3<<4;
System.out.println(a);
/*把3的二进制位向左移动4位
*          00000000 00000000 00000000 00000011
*  (0000)0000 00000000 00000000 00000011(0000)
* 二进制结果:00110000  转换成十进制结果: 48
int e=-5<<4;
System.out.println(e);
/*把-5向左移动4位
*     10000000 00000000 00000000 00000101 原码
*     11111111 11111111 11111111 11111010 反码
*     11111111 11111111 11111111 11111011 补码
* 11111111 11111111 11111111 11111011(0000)
* 1111 11111111 11111111 111110110000  补码
* 1111 11111111 11111111 111110101111  反码
* 1000 00000000 00000000 000001010000 原码
* 十进制结果-80
*/



6.   右移运算>>

被移位的二进制最高位是0,右移后,空缺位补0;最高位是1,最高位补1。
int b=5>>4;
/*把5的二进制位向右移动4位
* 00000000 00000000 00000000 00000101
* (0000)00000000 00000000 00000000 0000(0101)
结果是:0
int d=-5>>4;
System.out.println(d);
/*把-5向右移动4位
* 10000000 00000000 00000000 00000101 原码
* 11111111 11111111 11111111 11111010 反码
* 11111111 11111111 11111111 11111011 补码
* 111111111111 11111111 11111111 1111(1011)
* 111111111111 11111111 11111111 1111  补码
* 111111111111 11111111 11111111 1110  反码
* 100000000000 00000000 00000000 0001 原码
* 十进制结果-1
*/



7.   无符号右移>>>


4000
移位二进制最高位无论是0或者是1,空缺位都用0补。

int b=5>>>4;
/*把5的二进制位向右移动4位
* 00000000 00000000 00000000 00000101
* (0000)00000000 00000000 00000000 0000(0101)
结果是:0

计算出24的二进制:11000   :-24 >>> 2
原码:10000000 00000000 00000000 00011000
反码:11111111 11111111 11111111 11100111
补码:11111111 11111111 11111111 11101000

11111111 11111111 11111111 11101000
0011111111 11111111 11111111 111010(00)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  位运算符