取反:
在二进制中第一位,1表示符数,0表示正数
byte a = -1;
原码:10000001
反码:11111110
补码:11111111
//异或: 00000000
byte b = -2;
原码:10000010
反码:11111101
补码:11111110
//异或: 00000001
byte c = 3;
// 10000101
System.out.println(~a);
System.out.println(~b);
System.out.println(~c);
运算结果:
0
1
-4
右移:正数右移.负数右移 ,无符号右移
右移的符号是:>>
无符号右移的符号的:>>>
在左右位移时应注意,位移是否超过了数据的长度,如果超过了就会进行取摸运算等:下面的代码中有测试到
//右移:
//右移一个正数,右移一个整数每次在左边补0
int a = 5;
System.out.println(a>>1);
//原码;0000000101
//右移一位: 0000000010
System.out.println(a>>2);
//原码;0000000101
//右移两位: 0000000001
System.out.println(a>>3);
//原码;0000000101
//右移三位: 0000000000
System.out.println(a>>31);
//原码; 0000000101
//右移32位: 0000000000
System.out.println(a>>32);
//int 为32位,当位移等于32时,相当于没有移动,会进行取摸运算
System.out.println(a>>34);
//位移大于32时,进行取摸运算 34%32 = 2
//此时相当于位移两位
System.out.println(a>>>1);
//无符号右移最高位补0
// 原码: 0000000101
//无符号右移 : 0000000010 2
运算结果:
2
1
0
0
5
1
2
负数右移:
//右移一个负数,右移一个整数每次在左边补1
//位移负数,应先将其装换成补码形式,再位移
int a = -5;
//原码:100000101
//反码:111111010 反码是和原码的数相反 第一位相同(符号位)
//补码:111111011 补码在反码后面加1
System.out.println(a>>1);
//补码:111111011
//补码右移一位: 111111101 -3
System.out.println(a>>2);
//补码:111111011
//补码右移两位: 111111110 -2
System.out.println(a>>3);
//补码:111111011
//补码右移三位: 111111111 -1
System.out.println(a>>4);
//补码:111111011
//补码右移四位: 111111111 -1
System.out.println(a>>31);
//补码:111111011
//补码右移31位: 111111111 -1
System.out.println(a>>32);
//int为32 位的数,在位移时,等于没有移动 -5
System.out.println(a>>34);
//int 为32位的,位移34会进行取摸运算 34%32 =2 -2
System.out.println(a>>>1);
//无符号负数的右移在最高位补1;
//补码:111111011
//无符号右移1位:011111101 此时负数将变成一个正数
-3
-2
-1
-1
-1
-5
-2
2147483645
左移:
左移的符号:<<
左移无符号的正负数的符号:<<<
左移的右边补0
//左移正数
int a = 5;
//补码:00000101
System.out.println(a<<1);
//00001010 10
System.out.println(a<<2);
//00010100 20
System.out.println(a<<31);
//为一个负数,左移应注意
运算结果:
10
20
-2147483648
左移负数:
左移都是右边补0
int a = -5;
//补码:11111011
System.out.println(a<<1);
//左移一位:11110110 -10
System.out.println(a<<2);
//左移两位:11101100 -20
System.out.println(a<<31);
//左移31会出现问题
System.out.println(a<<34);
//相当于左移两位
//左移两位:11101100 -20
运算结果:
-10
-20
-2147483648
-20
使用位移来求二进制的问题:
public static void main(String[] args) {
//通过右移将十进制的数转换成二进制
int a = 100;
for(int i =31;i>0;i--){
System.out.print(a>>i&1);
}
}
运算结果:
0000000000000000000000000110010