基本类型算法题目学习(EPI)

1.关于奇偶校验的方法中,如何快速的求取一个64-bit的数字的奇偶校验位。(如果1的位数为奇数,则奇偶校验位为1,如果1的位数为偶数,则奇偶校验位为0)

    a.暴力枚举法采用一位一位进行计算,一位一位的移位,效率较低。

int getParity(long long _64bitsnum) {
    int _1count = 0;
	for(int i = 0;i < 64;i++) {
	    if( (_64bitsnum>>i)&1UL ) {
		    _1count++;
		}
	}
	return _1count % 1;
}

    b.x = x & (x-1),每次将最低位的1进行失效,统计1的个数。

int getParity(long long _64bitsnum) {
	int _1count = 0;
	while(_64bitsnum) {
		_1count++;
		_64bitsnum = _64bitsnum & (_64bitsnum - 1);
	}
	return _1count % 1;
}

    c.可以采用查表法,例如8位为一个单元,255的空间每个对应1的个数,按照单元统计1的个数。

2.调换64-bit数字的第i位和第j位

    a. i位如果与j位相同,没必要进行替换,如果不同,替换的方法为( 1<<i | 1<<j ) ^ 原数字即可。

bool swapbits(long long &_64bitnum,int i,int j) {
	//利用异或的性质
	if( (_64bitnum >> i) & 1LL != (_64bitnum >> j) & 1LL ) {
		_64bitnum ^= ( (1LL << i) | (1LL << j) );
	}
	return true;
} 

3.将一个64-bit数字的所有位进行逆序

    a.不断的调用上面调换的方法。

bool bitreverse(long long &_64bitnum) {
	for(int i = 0;i < 32;i++) {
		swapbits(_64bitnum,i,63-i);
	}
	return true;
} 

    b.采用查表法,以单元为单位。

4.不适用乘,除,模运算求取两个数的最大公约数(GCD)

    a.可以利用减法模拟辗转相除法。

    b.递归不断的缩小问题规模。

5.返回1至n之前的素数

    a.建立1-n的表,然后利用某个数的倍数将表中不为素数的不断至为false,如果一个一个数字的判断是否是素数效率太低。

6.使用位操作完成两个无符号数字的乘法运算

    a.二进制以为,利用位操作模拟加法操作。

7.利用加,减,乘,位操作完成除法的运算

    a.总体思想采用减法,但是可以减去2^k,这样可以加快减法的速度。

posted @ 2014-08-25 00:54  weixliu  阅读(...)  评论(...编辑  收藏