位运算题目

题目一:

题目描述:

函数int bis(int x,int m)(位设置)生成一个结果z,z是由m的位来修改x的位得到的,在m的二进制表示为1的每个位置上,将z对应的位设置为1。

函数int bic(int x,int m)(位清除)生成一个结果z,z是由m的位来修改x的位得到的,在m的二进制表示为1的每个位置上,将z对应的位设置为0。

仅使用bis和bic来计算异或运算

int xor (int x,int y) {

    int result = ____ ;

    return result;

}

题目分析:

容易知道,bis运算等价于OR,bic运算等价于x & ~ m。对于^,有属性x ^ y = (x & ~ y)| (y & ~ x),由此可以得到

int xor (int x,int y) {

    int result = bis(bic(x, y), bic(y, x));

    return result;

}

题目二:

题目描述:

不用 '*' '/' 和 '%' 运算实现两个整数的除法

题目分析:

例如 16 / 3,可以按照3的倍数来操作。 3 * 1 = 3, 3 * 2 = 6, 3 * 2 * 2 = 12 ...,而2 * 2等可以用位运算方式表示。

那么有16 - 3 = 13, 13 - 3 * 2 = 7, 而7 < 3 * 2 *2。可以迭代处理,再计算剩下的 7 / 3,依次进行。

示例代码:

int divide(int dividend, int divisor) {
   
long long a = abs((double)dividend), b = abs((double)divisor), ret = 0;
   
while(a >= b) {
       
for(long long c = b, i = 0; a >= c; ++i, c <<= 1) {
            a
-= c;
            ret
+= 1 << i;
        }
    }

   
return ((dividend ^ divisor) >> 31) ? -ret : ret;
}

你可能感兴趣的:(位运算)