位操作在编程中的应用

本文内容来自位操作基础篇之位操作全面总结

  • 位操作包括:与(&)、或(|)、异或(^,异为1,同为0)、左移(<<,高位丢,底补0)、右移(>>)、非(~)
  • 编程中位操作常用的地方
1、判断基偶

根据末位决定 (a&1)==0为偶数

2、交换两数

a^=b;b^=a;a^=b;

3、变换符号

正负互换,只需要取反再加1

4、求绝对值

负数只需要求反加1即可,过程:先左移取符号,对int型有

int abs(int a)
{
int i = a>>31; 
return i==0?a:~a+1; // 或者 return ((a^i)-i);即取反加1的效果
}
5、高低位交换

对于无符号数short为例,左移8位,右移8位,取或即可

6、二进制逆序

归并交换实现

7、二进制中1的个数

第一步:每2位为一组,组内高低位相加
10 00 01 10 11 01 10 00
-->01 00 01 01 10 01 01 00
第二步:每4位为一组,组内高低位相加
0100 0101 1001 0100
-->0001 0010 0011 0001
第三步:每8位为一组,组内高低位相加
00010010 00110001
-->00000011 00000100
第四步:每16位为一组,组内高低位相加
00000011 00000100
-->00000000 00000111

    a = ((a & 0xAAAA) >> 1) + (a & 0x5555);  
    a = ((a & 0xCCCC) >> 2) + (a & 0x3333);  
    a = ((a & 0xF0F0) >> 4) + (a & 0x0F0F);  
    a = ((a & 0xFF00) >> 8) + (a & 0x00FF);   
8、缺失的数字

很多成对出现数字保存在磁盘文件中,注意成对的数字不一定是相邻的,如2, 3, 4, 3, 4, 2……,由于意外有一个数字消失了,如何尽快的找到是哪个数字消失了?
由于有一个数字消失了,那必定有一个数只出现一次而且其它数字都出现了偶数次。用搜索来做就没必要了,利用异或运算的两个特性——1.自己与自己异或结果为0,2.异或满足交换律。因此我们将这些数字全异或一遍,结果就一定是那个仅出现一个的那个数。


reference

位操作基础篇之位操作全面总结

你可能感兴趣的:(位操作在编程中的应用)