bitwise

位运算的几个技巧。首先明白整数都是使用补码来存储的。

1. 0的补码只有1个:0=0x00000000; -1的补码是-1=0xFFFFFFFF;负数的补码是其相反数的原码各位取反,然后加1。

2. a^(-1)=~a=-a-1;即一个数跟-1进行按位异或运算的结果就是将这个数的各位置非,所得的值恰好比其相反数少1。

3. 因为一个数与0进行按位异或的结果仍是它本身,即a^0=a;

4. 利用(2)和(3)可以方便地实现一个数的绝对值:

abs(a)= (a^(a>>31)-(a>>31);

5. 利用(4)可以方便求两个数中较大的数了:

max(a,b)=(a+b+abs(a-b))/2;

6. 而且交换两个数也可以使用异或来做:

swap(int *a, int *b){
  if(0!==a-b){
    *a=*a^*b;
    *b=*a^*b;
    *a=*a^*b;
  }
}

7. 4位存储空间下-8到7的补码表示:

-8=1000  7=0111
-7=1001  6=0110
-6=1010  5=0101
-5=1011  4=0100
-4=1100  3=0011
-3=1101  2=0010
-2=1110  1=0001
-1=1111  0=0000

还是比较有规律的。

8. 求一个整数中1的个数。

/*
 * szlBitInInt.c
 */
#include "szlBitInInt.h"
int szlBitInInt(int n_1){
	int un_count=0;
	while(n_1){
		++un_count;
		n_1=(n_1-1)&n_1;
	}
	return un_count;
}


你可能感兴趣的:(bitwise)