我正在编写一个带参数的函数:
int nbit2s(long int x, long int n){
}
我希望接收64位数x,并找出 n 位长度的2位表示是否可行。但是,我仅限于使用按位运算符并排除使用运算符,例如> =< =和条件语句
例如,nbit2s(5,3)返回0,因为表示是不可能的。
我不是在寻找任何代码,只是为了提出想法,到目前为止,我的想法一直是:
我觉得这是正确的方向,但如果有人能够解释这可能是一个更好的方法,或者我可能犯过的任何错误,那就太棒了。
答案 0 :(得分:2)
如果我正确理解您的问题,您希望确定整数x
是否可以表示为n
或更少位的二进制数。
测试此方法的一种简单方法是使用按位AND运算符屏蔽超出最大值的所有位,然后查看屏蔽整数是否与原始整数相同。
示例:
bool nbit2s(uint64_t x, int n) {
return (x & (1ULL << n) - 1) == x;
}
答案 1 :(得分:1)
正数的解决方案是向右移n
。如果它仍然不为零,那么它需要超过n
位来表示它。
但是由于论证已经签署并且您正在讨论2补语表示,因此您可能必须将其转换为无符号表示以避免符号扩展。