标签:位运算 32位 个数 mamicode 异或 info amp style 原来
位运算符
左移:<<
例子: 3<<2 = 12 -> 3*2*2=12 m<<n = m * 2n
System.out.println(4 << 4);//64
System.out.println(2 << 30);//-2147483648 int的范围-2147483648~2147483648 ,2<<30已经超出范围
System.out.println(-4 << 2);//-16
System.out.println(4 << -2);//0
System.out.println(-5 << -1);//-2147483648
左移前面全部补全0
右移:>> a-p = 1 /ap
例子:3>>1 = 1 -> 3/2=1 m>>n = m / 2n
右移补全数字是根据左边原来第1个符号决定,如果左边第1个符号是0那么前面就补0,如果是1,前面就补1
System.out.println(100 >> 3);//12 100/8 = 12.5
System.out.println(-100 >> 3);//-13 -100/8 = -13
正数二进制->反码->加1(补码)->负数二进制
负数二进制->减1->反码->正数二进制
反码:1变成0,0变成1
补码:加1
//总结:右移的右边的数字阶乘不能超过左边的数字,否则1/大于1的结果都是0,而且正数右移就丢掉尾数,负数右移就四舍五入,后面这规律是十进制推算出来的,有点误差
无符号右移:>>>,正数的>>>和>>一样效果
例子:3>>>1 = 1 3/2=1
符号是什么意思呢?
符号指的是32位最左边的第一位代表符号,1位负数,0位正数
0000 0000 0000 0000 0000 0000 0000 0000
那么无符号右移是什么意思呢?
就是忽略掉前面的符号是0还是1,直接补全0
//总结:位运算的右边的数字不能为负数,而且位移的结果不能超过int范围,否则从最小范围重新算
与运算:& 比较两个数的二进制
例子:12 & 5= 4 1相当true, 0相当false
或运算:| 比较两个数的二进制
例子:6 | 3 = 7
异或运算:^ 比较两个数的二进制,不一样就1,其他0
例子:6 ^ 3 = 5
反码: 1变0,0变1 注意反码符号是~波浪线
例子:~6 = -7
总结:左移没有符号,右移有符号区别,当32位第一个符号为0,就补全0,如果是1前面就补全1,位运算右边的数字不能为负数。
标签:位运算 32位 个数 mamicode 异或 info amp style 原来
原文地址:https://www.cnblogs.com/unlasting/p/12331676.html