取反: 在二进制中第一位,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