java中的位运算符
概述
Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型
分类
左移( << )、右移( >> ) 、无符号右移( >>> ) 、位与( & ) 、位或( | )、位非( ~ )、位异或( ^ ),除了位非( ~ )是一元操作符外,其它的都是二元操作符
说明
左移<<
public static void main(String[] args) {
int a= 10;
System.out.println(a<<3);//80
}
实质就是a乘2的3次幂;
原理
把10转换成二进制:
00000000 00000000 00000000 00001010
然后整体向左移动三位,不足位用0补齐:
00000000 00000000 00000000 01010000
结果就是80
被除数是负数的时候
System.out.println(-10<<3);//-80
右移>>
public static void main(String[] args) {
int a= 10;
System.out.println(a>>3);//1
}
实质就是10除以2的3次幂
原理
把10转换成二进制:
00000000 00000000 00000000 00001010
然后把数据整体向右移动三位,不足位用0补齐:
00000000 00000000 00000000 00000001
结果就是1
被除数是负数的时候
System.out.println(-10>>3);//-2
把-10的补码求出来:
原码:1 0000000 00000000 00000000 00001010
反码:1 1111111 11111111 11111111 11110101
补码:1 1111111 11111111 11111111 11110110
操作: 1 1111111 11111111 11111111 11111110 注意此处用1补位
反码:1 1111111 11111111 11111111 11111101
原码:1 0000000 00000000 00000000 00000010 就是-2
无符号右移>>>
没有无符号左移
System.out.println(10>>>3);
当要操作的数是正数的时候和普通右移结果相同
当数是负数的时候
System.out.println(-10>>3); //-2
System.out.println(-10>>>3); //536870910
把-10的补码求出来:
原码:1 0000000 00000000 00000000 00001010
反码:1 1111111 11111111 11111111 11110101
补码:1 1111111 11111111 11111111 11110110
操作:0 0011111 11111111 11111111 11111110 注意此处用0补位
正数的原反补相同结果就是536870910
正数右移,高位用0补,负数右移,高位用1补,当负数使用无符号右移时,用0进行部位(自然而然的,就由负数变成了正数了)
位与&
System.out.println(10&5);//0
把10转换成二进制:
00000000 00000000 00000000 00001010
把5转换成二进制:
00000000 00000000 00000000 00000101
只有对应的两位都是1的时候才是1,否则就是0,那么结果就是0
位或|
System.out.println(10|5);//15
把10转换成二进制:
00000000 00000000 00000000 00001010
把5转换成二进制:
00000000 00000000 00000000 00000101
只有对应的两位某一个是1的时候结果就是1,否则就是0,那么结果就是15
位异或^
System.out.println(10^5);//15
把10转换成二进制:
00000000 00000000 00000000 00001010
把5转换成二进制:
00000000 00000000 00000000 00000101
当对应的两位不相等的时候是1,相同的时候是0,结果还是15
位非
System.out.println(~10 );//-11
把10转换成二进制:
00000000 00000000 00000000 00001010
求位非运算:
1 1111111 11111111 11111111 11110101
求反码:
1 1111111 11111111 11111111 11110100
求原码:
1 0000000 00000000 00000000 00001011 就是-11
衍生运算符
&= 按位与赋值
|= 按位或赋值
^= 按位非赋值
>>= 右移赋值
>>>= 无符号右移赋值
<<= 赋值左移
更多精彩好玩的文章请参见:天意的个人博客没有广告(⊙o⊙)哦