找到n位长度2s补充数字的表示

时间:2016-01-29 05:11:21

标签: c binary bitwise-operators twos-complement

我正在编写一个带参数的函数:

int nbit2s(long int x, long int n){

}

我希望接收64位数x,并找出 n 位长度的2位表示是否可行。但是,我仅限于使用按位运算符并排除使用运算符,例如> =< =和条件语句

例如,nbit2s(5,3)返回0,因为表示是不可能的。

我不是在寻找任何代码,只是为了提出想法,到目前为止,我的想法一直是:

  1. 输入数字n并将其转换为二进制表示。
  2. 左移二进制表示64-n次以获得MSB并将其存储在变量班次中 3.向右移动64-n以获得领先位并在班次中存储
  3. XOR的原始数字,如果为1则为TRUE,0则为FALSE。
  4. 我觉得这是正确的方向,但如果有人能够解释这可能是一个更好的方法,或者我可能犯过的任何错误,那就太棒了。

2 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,您希望确定整数x是否可以表示为n或更少位的二进制数。

测试此方法的一种简单方法是使用按位AND运算符屏蔽超出最大值的所有位,然后查看屏蔽整数是否与原始整数相同。

示例:

bool nbit2s(uint64_t x, int n) {
    return (x & (1ULL << n) - 1) == x;
}

答案 1 :(得分:1)

正数的解决方案是向右移n。如果它仍然不为零,那么它需要超过n位来表示它。

但是由于论证已经签署并且您正在讨论2补语表示,因此您可能必须将其转换为无符号表示以避免符号扩展。