1.青铜挑战——理解位运算的规则
1 数字在计算机中的表示
机器数:一个数在计算机中的二进制表示形式
机器数带符号,在计算机中用一个数的最高位存放符号,正数为0,负数为1.
真值:将带符号位的机器数对应的真正数值成为机器数的真值。
计算机对机器数的表示进一步细化:原码,反码,补码
源码:符号位加上真值的绝对值,即用第一位表示符号,其余位表示值。8位二进制数的取值范围就是:[-127,127]
反码:整数的反码是其本身,
负数的反码是在其原码的基础上,符号位不变,其余各个位取反。
补码:能保持加和减运算的统一
正数的补码就是其本身
负数的补码是在其原码的基础上,符号位不变,其余各位取反,最后+1(在反码的基础上+1)
补码表示的范围是[-128,127]
机器只有加法,将符号位参与运算,原码的减法不正确,反码真值部分正确,但是+-0没有意义,补码解决了0的符号以及两个编码的问题。
2 位运算规则:
位运算主要有:与,或,异或,取反,左移,右移,左移和右移统称为移位运算,移位运算又分为算术移位和逻辑移位
2.1 与 或 异或和取反
& | ∧ ~
2.2 移位运算
左移和右移:按照移位方向分类
算术移位和逻辑移位:带符号分类
左移一次相当于乘以2,右移一次相当于除以2
左移:<< 高位丢弃,低位补0,算术移位和逻辑移位是相同的
右移:>> 低位丢弃,高位的补位由算术移位(高位补最高位)或逻辑移位(高位补0)决定
对于0和正数,算数右移和逻辑右移的结果是相同的。
2.3移位运算与乘除法的关系
计算机的底层一切运算都是基于位运算实现的,因此使用移位运算实现的乘除法的效率显著高于直接乘除法的。
左移运算对应乘法运算,但是要注意溢出的情况
算数右移运算对应除法运算,结果向下取整。将一个算术右移K位和将这个数除以2^k是不等价的,大部分算法题都将测试数据限制在正数和0的情况,因此可以放心的左移或者右移。