您的位置:首页 > 编程语言 > C语言/C++

【算法导论】二进制运算技巧(持续添加)

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息