Bits Bytes and Integers
Bits,Bytes and Integers
基础位运算
分清&,&&,| ,||,~,!之间的区别
位操作: &,|,~,运算时只是单纯进行位操作
逻辑比较: &&,||,!,运算时会添加逻辑考虑,
比如||前面的为True,则提前中止调用
又比如,对一个非0的数进行!两次会获得一个1,这和位操作有很大的区别
算术右移和逻辑右移
逻辑右移: 将整个数字向右移动,同时高位补0
算术右移: 将整个数字向右移动,同时高位按照符号位补充
左移的特殊情况
如果一个八位的数字进行左移八位的操作,在部分计算机中,这个8将被模8,因此并不能得到想象中的0
补码 T
国内讲法: 除了符号位,全部按位取反再加1
这课的讲法:最高位视为负权,如[-16,8,4,2,1]
经典图片
扩展
例如:8位->16位
基本规则:将符号位复制k份,k为扩展位数
解释,想象负数的情况,假设最高位权重暂时是-8,增加一位最高位,新增一位-16,但之前的最高位变为+8,刚好抵消。
加减乘除
无符号数直接不谈
补码加法: 可以通过补码加法简单得到减法,只要加上负的值就行
正/负溢出
正溢出:俩正数加起来等于一个负数
乘法
如果乘2的倍数,只需要【算术】移位就行了,不管是不是补码表示
除法
同样是算术移位,但这回如果是负数,它就不是四舍五入,而是向负无穷舍入,例如 -3/2=-2。而不是-1
获得相反数
按位取反再+1
一个恐怖的案例
这里,i会被隐式转换成unsigned int(因为sizeof是 unsigned int),于是这个for循环不会结束
无符号数的优点
由于无符号数的计算采用取模的方式
在一些模运算时(比如大多数加密算法)
当位表示集合而非数字时,用无符号数最好。
字存储
最低有效字节在小端序电脑中放在首位,在大端机器中放在末位
Bits Bytes and Integers