C/C++面试题-位操作1

    这几天做了一些C/C++企业面试题,今天开始整理了一些编程题目,希望有更好想法的朋友多多指点,我们互相学习。

    有一道题目描述是这样的:unsigned int intvert(unsigned int x,int p,int n)实现对 x 的进行转换,p 为起始转化位,n 为需要转换的长度,假设起始点在右边.如 x=0b0001 0001,p=4,n=3转换后 x=0b0110 0001 。请写出函数主体。

从题目中例子看出,将x从p位开始,实现n位取反,然后我们就有思路了,我的代码如下:

#include <stdio.h>

#define SHIFT (sizeof(int)*8)//需要进行位移,位移长度为一字长,即32位

unsigned int invert(unsigned int x, int p, int n)

{
unsigned int temp1,temp2;//temp1,temp2作为操作中间变量
int pn = n;
unsigned int mask = 0xffffffffu;//设置掩码
mask >>= (SHIFT - n);//将掩码向右移动SHIFT-n位,保证初n位外其他位均置零
mask <<= p;//此时将掩码不为零的n位放到x中起始为p的位置上
temp1 = x&(~mask);//将x中起始位置为p,长度为n位的bit置零,其余位数不变
temp2 = (~x)&mask;//将x中起始位置为p,长度为n为的bit取反,其余位置零
return (temp1|temp2);//返回 操作完成的数
}

int main(void)
{//测试代码
unsigned int base,result;
base = 555u;
result = base;
int start = 3;
int count = 4;
int cursor = SHIFT;
while (--cursor > -1)
{
printf("%u", (result & 0X80000000u) ? 1 : 0);
result <<= 1;
}
puts("");
result = invert(base, start, count);
while (++cursor < SHIFT)
{
printf("%u", (result & 0X80000000u) ? 1 : 0);
result <<= 1;
}
puts("");
return 0;
}

---------------------------------------------------------------------

原题中有相应解题代码,如下

unsigned int intvert(unsigned int x,int p,int n){
unsigned int _t = 0;
unsigned int _a = 1;
for(int i = 0; i < n; ++i){
_t |= _a;
_a = _a << 1;
}
_t = _t << p;
x ^= _t;
return x;
}

这个算法很巧妙,巧妙的利用了异或位运算,当掩码为1的时候,与一个数x异或后的结果为~x,很好的满足了题目的要求。算法1比较易懂,算法2比较聪明。



猜你喜欢

转载自blog.csdn.net/lianyumook2010/article/details/79653213