C/C++01: 善用位计算

原文地址: http://blog.csdn.net/morewindows/article/details/7354571

推荐书籍: Hacker's Delight

1.判断奇偶

1 if (a & 1)
2 {
3     printf("%i is an odd number", a);
4 }

2.交换两数

1 void Swap(int &a, int &b)
2 {
3     if (a != b)
4     {
5         a ^= b;
6         b ^= a;
7         a ^= b;
8     }
9 }

3.变换符号

1 int SignReversal(int a)
2 {
3     return ~a + 1;
4 }

4.求绝对值

1 int my_abs(int a)
2 {
3     int i = a >> 31;
4     return ((a ^ i) - i);
5 }

注:如果a是负数,那么a右移31位为-1

5.高低位交换

 1 #include <stdio.h>
 2 
 3 template <class T>
 4 void PrintfBinary(T a)
 5 {
 6     int i;
 7     for (i = sizeof(a) * 8 - 1; i >= 0; --i)
 8     {
 9         if ((a >> i) & 1)
10             putchar('1');
11         else
12             putchar('0');
13         if (i == 8)
14             putchar(' ');
15     }
16     putchar ('\n');
17 }
18 
19 int main()
20 {
21     printf("Before: ");
22     unsighed short a = 12345;
23     PrintfBinary(a);
24 
25     printf("After: ");
26     a = (a >> 8) | (a <<8);
27     PrintfBinary(a);
28     return 0;
29 }

6.二进制逆序

 1 #include <stdio.h>
 2 int main()
 3 {
 4     printf("Before: ");
 5     unsigned short a = 12345;
 6     PrintfBinary(a);
 7 
 8     printf("After: ");
 9     a = ((a & 0xAAAA) >> 1) | ((a & 0x5555) << 1);
10     a = ((a & 0xCCCC) >> 2) | ((a & 0x3333) << 2);
11     a = ((a & 0xF0F0) >> 4) | ((a & 0x0F0F) <<4);
12     a = ((a & 0xFF00) >> 8) | ((a & 0x00FF) <<8);
13     PrintfBinary(a);
14 
15     return 0;
16 }

7.二进制中1的个数

 1 #include <stdio.h>
 2 int main()
 3 {
 4     unsigned short a = 12345;
 5     a = ((a & 0xAAAA) >> 1) + (a & 0x5555);
 6     a = ((a & 0xCCCC) >> 2) + (a & 0x3333);
 7     a = ((a & 0xF0F0) >> 4) + (a & 0x0F0F);
 8     a = ((a & 0xFF00) >> 8) + (a & 0x00FF);
 9     printf("Have %i ones in binary", a);
10     return 0;
11 }
posted @ 2015-09-27 21:14  Toorist  阅读(165)  评论(0编辑  收藏  举报