【算法导论】二进制运算技巧(持续添加)
2017-01-30 15:02
316 查看
1、奇偶性判断
奇数末尾为1,偶数末尾为0原因
偶数+偶数=偶数
偶数+奇数=奇数
奇数+奇数= 偶数
所以想要变成奇数控制权就在最后一位了!
2、取高/低n位
比如想要取二进制数的高八位或者低八位,只需要使用与运算。取低八位1001100101111111 & 0xFF = 01111111
取高八位(1001100101111111 & 0xFF)>>8 = 10011001
原因
与运算是所两位都为1时结果该位才为1,反过来说只要数位为0,就取出来一定是0。1001,1001,0111,1111 0xFF & 0000,0000,1111,1111 = 0111,1111(低八位)
3、验证某位是1还是0
这种方法也叫“掩码”比如验证 1001,1001,0111,1111 的第7位,只需要
1001,1001,0111,1111 & 0100,0000 = 100,0000
而在C/C++语言中,0代表false,非0为true,所以与运算结果可直接当作条件表达式,true就代表这位为1,false就代表为0
更好的记法:判断某位是否是1
4、将某位置位
只需要使用异或运算即可比如想要 1001,1001,0111,1111 的第7位为0,只需要
1001,1001,0111,1111 ^ 0100,0000 = 0011,1111
0^0=0 //① 0^1=1 //② ①+②说明异或只要是0的位不影响最终结果 1^0=1 1^1=0
4、将某位设置为1
只需要使用异或运算即可比如想要 1001,1001,0111,1111 的第8位为1,只需要
1001,1001,0111,1111 | 1000,0000 = 1111,1111
5、翻倍、折半
翻倍:某数<<1 当且仅当不溢出时有效折半:某数>>1 当且仅当不为0时有效
6、二进制中1位个数
如果原数是偶数,那么n的二进制中1的个数=n/2中1的个数如果原数是奇数,那么n的二进制中1的个数=n/2中1的个数+1
原因
当n是偶数时,n是由n/2左移一位而来,而左移并不会增加1的个数。当n是奇数时,n相当于n/2左移一位再加1。
6、绝对值
(n ^ (n >> 31)) - (n >> 31)
原因
n>>31 取得n的符号,若n为正数,n>>31等于0,若n为负数,n>>31等于-1若n为正数 n^0=0,数不变
若n为负数有n^-1 需要计算n和-1的补码,然后进行异或运算,
结果n变号并且为n的绝对值减1,再减去-1就是绝对值
7、获取数据类型表数范围
比如一个8位有符号数//最大值 (1 << 8) - 1 //最小值 1 << 8
相关文章推荐
- 统计一个整数的二进制中1的个数(位运算技巧)
- 【大数算法】( 十进制整数四则运算) 十进制运算与二进制比较与思考
- 【hihoCoder太阁最新面经算法竞赛13 C】【01背包】Target Sum【给一个序列在序列中添加+或者-,使得运算结果为s,求方法数】
- 20161208计算机科学导论02_二进制运算
- 20161208计算机科学导论02_二进制运算
- 传说中百度的试题,用C#做二进制运算得到2.5亿数字中不重复数字数的O(n)算法
- 20161208计算机科学导论02_二进制运算
- 位运算的一些技巧,持续更新中
- JavaScript常用技巧总结(持续添加中...)
- 20161208计算机科学导论02_二进制运算
- javascript 二进制运算技巧解析
- ACM二进制运算技巧
- ACM二进制运算技巧
- 位运算在算法编程中的使用技巧
- 统计一个整数的二进制中1的个数(位运算技巧)
- 汇编实现多字节二进制除法运算算法
- 位运算加速技巧【持续更新】
- 二进制运算技巧
- 20161208计算机科学导论02_二进制运算
- 20161208计算机科学导论02_二进制运算