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比较聪明。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值