Bit Operation
Background :
二进制整数,符号位,补码
二进制小数 : 只能精确表示1/2的幂之和的小数
八进制:每个数位对应3个二进制位
十六进制:每个数位对应4个二进制位
原码:最高位为符号位,0正,1负
反码:除符号位外,各位转置(取反)
补码:正数的原码&负数的(反码 + 1) 【该编码被计算机采用】
位字段:
把连续的位看成一段,如:八进制,十六进制
Basis Operation : 只读函数
逻辑: |(按位或) &(按位且) ~(按位取反) ^(按位异或,判断真假性是否不同)
移位: >>(右移) <<(左移)
Bit Application :
逻辑
1. 求相反数
原理:原码与补码的转换。无论正负,各位取反再加一.
例: ++( Value ^max_int ) == - value
2. 掩码屏蔽不感兴趣的位 (读)
原理:0 & #m = 0, 1 & #n = #n,
掩盖不必要位,获取所需位
例:1010 1011(来源) &0000 0101(掩码) = 0000 0001(获得#0和#2的位状态)
注意:不要越界,掩码宽度不应超过来源码
3. 位的开闭(| 一真则真, & 一假则假)(写)
原理:0 & #m= 0, 1| #n = 1.( 0|#x=#x 和0&#y=0)
无论来源的位状态,强制改变特定位而不影响其他位
例:1111 0101 | 00000010 = 1111 0111(打开#1,其余不变)
1111 0101 & 0000 0011 = 0000 0001(#0#1不改变,其余关闭)
4. 位的转置
转置:真假性的对立面 即!p
原理:1 ^ #m = ~#m
例:0110 1101 ^ 11111111 = 1001 0010
工具表:0,1与4种逻辑位运算的排列组合,找到自己的所需.
分析:从#0开始,迭代思考
移位
有符号值,缺位的填补处理视机器而定
1. 左移<<
原理:value<< n //表示value * 2n
例:(129) 1000 0001<< 1 = 0000 0010 (2)
2. 右移<<
原理:value >> m //表示value / 2m,右溢出部分表示value % 2m
例:(18) 0001 0010>> 2 = 0000 0100 (4)……10 (2)
(类似地,十进制中,小数点的移动来实现乘除10)
实例:
① 判断奇偶
原理:value % 2 ? 1 :0
做法:提取最低位,判断1或0
② 提取符号位
原理:获得最高位
做法:value << ( sizeof(int) * 8 - 1 )
③ 交换变量值
原理:m^n^n(^m) = m(n)
做法:a^=b, b^=a, a^=b;