• 基本类型算法题目学习(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,这样可以加快减法的速度。

  • 相关阅读:
    利用scanf函数修改内存中任意位置内容
    TSql
    完整性约束及其违约处理
    实现关机、重启、注销
    建立索引的原则
    我只想安静的大便
    格式化GridView特定的值
    SELECT语句执行顺序解析
    CPU对存储器的读写
    Linux常用97条命令
  • 原文地址:https://www.cnblogs.com/weixliu/p/3933969.html
Copyright © 2020-2023  润新知