专栏目录请点击
简介
- 计算机对于二进制数据的运算就叫做为运算,即将一个整数的二进制格式进行运算,先转化为二进制数,然后进行运算
- 十进制转化为二进制工具 点击
&
- 写法为
表达式1 & 表达式2
- 参加运算的两个数据,按二进制位进行“与”运算
- 两位同时为“1”,结果才为“1”,否则为0,就是将两个整数的每一个二进制位进行比较,如果都为1,结果才为1,其余情况全部为0;
例子
1 & 2
- 1 对应的二进制是–
0000 0000 0000 0000 0000 0000 0000 0001
- 2 对应的二进制是–
0000 0000 0000 0000 0000 0000 0000 0010
进行运算
由于前28位都为0,结果与运算后肯定也全为0,这时就算后四位
- 0 0 0 1 -
- 0 0 1 0 -
- -----------
- - 0 0 0 0 - //结果为0000,转换为十进制为0,那么1 & 2的结果就为0
|
-
表达式1 | 表达式2
-
计算步骤
-
将比较的两个整数,先转换为32位二进制,然后每一位进行比较,全0才为0,其余情况全为1
例子
1 | 3
- 1 对应的二进制是
0000 0000 0000 0000 0000 0000 0000 0001
- 3 对应的二进制是
0000 0000 0000 0000 0000 0000 0000 0011
进行计算
由于前30位全为0,与运算后也全为0,可以不计入计算
- 0 1 -
- 1 1 -
- -------- -
- 1 1 - //二进制11,需要补齐32位才可以转换为十进制,那么1 | 3的结果就为3
~
~表达式
- 将这个整数全部二进制位按位取反,0变成1,1变成0
负数的存储方式
真码
如-1
的真码表示
> 1000 0000 0000 0000 0000 0000 0000 0001 //符号位为-表示负数,最后一位为1,表示1
使用的是8位二进制表示,但是实际上计算机存储的时候并不是这样存储的
反码
- 计算机拿出负数的真码
- 符号位不动,其余全部取反,这个时候叫做反码
补码
- 反码加上1就可以得到补码
- 计算机中存储的负数就是存储的补码
拿出真码 --> 1000 0000 0000 0000 0000 0000 0000 0001 // 也叫原码
得到反码 --> 1111 1111 1111 1111 1111 1111 1111 1110 // 真码取反
得到补码 --> 1111 1111 1111 1111 1111 1111 1111 1111 // 反码加1
所以,-1在计算机中的存储就是`1111 1111 1111 1111 1111 1111 1111 1111
以上方法只是负数的存储,正数在计算机中的存储原反补相同
取反
~1
- 1对应的二进制是
0000 0000 0000 0000 0000 0000 0000 0001
- 对于二进制进行取反
1111 1111 1111 1111 1111 1111 1111 1110
- 这个是得到存储在计算机中的补码,但是需要得到真码才能转化为二进制,下面开始转化为真码
- 先得到反码
1111 1111 1111 1111 1111 1111 1111 1101
补码-1就得到反码 - 然后转化为真码
1000 0000 0000 0000 0000 0000 0000 0010
符号位不变,其余全部取反,得到真码 - 真码转化为二进制位-2,所以~1的结果为-2
便捷操作
上面操作,确实可以得到一个数的取反的记过,但是过于繁琐,这里有一个便捷的方法
~x=-x-1
举例如下
~1 = -1-1 = -2
~2 = -2-1 = -3
~-2 = 2-1 = 1
快速取整
~~小数
举例如下
~~3.12345 = 3
异或运算
数字1 ^ 数字2
- 将数字1和数字2按32位二进制进行比较,不同为1,相同为0
例子
1 ^ 2
- 1对应的二进制为0000 0000 0000 0000 0000 0000 0000 0001
- 2对应的二进制为0000 0000 0000 0000 0000 0000 0000 0010
- 进行运算
-- 0 1 --
-- 1 0 --
---------
-- 1 1 -- // 二进制补齐32位,转换成十进制后,结果为3
移位
左移<<
num<<n
:他会先把num
转化为二进制,然后左移n
位
例子
3 << 1
- 3对应的二进制为0000 0000 0000 0000 0000 0000 0000 0011
- 左移一位后是0000 0000 0000 0000 0000 0000 0000 0110
- 所以3 << 1 的结果为 0110 ,转换为十进制为6
左移运算,是整个32位向左移动,最后移动多少位,后面补多少0
规律
由上面的例子可以得出左移的规律num * n的2次方
负数
-10<<2 // -40
右移>>
右位移可能会丢失精度
- 数字1 >> 数字2
- 右位移:将数字1的二进制位(除符号外),右位移数字2的次数
例子
- 3 >> 1
- 3对应的二进制为0000 0000 0000 0000 0000 0000 0000 0011
- 右移一位后是0000 0000 0000 0000 0000 0000 0000 0001
- 所以3 >> 1 的结果为 0001 ,转换为十进制为1
右移运算,是整个32位向右移动,最后移动多少位,符号位不变,前面补多少
规律
如上面3 >> 1
,右移就相当于 3 / 2^1,然后去整数部分,也就是1
全右位移
- 数字1 >>> 数字2
- 运算过程与右位移差不多,但是,全右位移,符号位会跟着移动
例子
-1 >>> 1
- -1对应的二进制为
1111 1111 1111 1111 1111 1111 1111 1110
- 全右位移后是
0111 1111 1111 1111 1111 1111 1111 1111
- 转化为10进制是
2147483647
- https://blog.csdn.net/m0_67502005/article/details/128036344