1. Bit Manipulation
位操作 Bit Manipulation
如果我们要将一个十六进制数 0x2020 取出从低到高第二位的值,我们最直接的方法就是使用 mask, 即
1 | a = 0x2020; |
如果要将这几位输出,我们就要 a = a >> 4; 就可以将数据向右 bit shift 4 位,然后我们就可以得到 0x0002 的值
为什么不能用 (a << 8) >> 12?
对于向右位移,我们可能会将超过长度的内容赋值 0, 但是向左位移则不是这样,向左的位移会被认为是 直接扩大数字
如果是 int 数据类型向左位移 100 位,这个等价于 << 100 % 32 因为 int 长 4 字节 32 位,编译器会将这一步截断到 4 位从而不为 0
编译器对于补码的理解
如果输入的数字是一个负数,对其进行 >> 操作得到的结果会和正数情况下不同,编译器会按照补码与否来进行操作,如果是 负数,就会填充 F; 如果是 正数,就会填充 0,因此如果要用循环来进行位提取,负数的终点是 即 -1 而正数的终点是 0
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
