Binary 按位操作:fitsBits函数
我在这个网站上看到了其他一些此功能的实现,但我很好奇是否有人能帮我找出此实现不起作用的原因:Binary 按位操作:fitsBits函数,binary,bit-manipulation,bitwise-operators,Binary,Bit Manipulation,Bitwise Operators,我在这个网站上看到了其他一些此功能的实现,但我很好奇是否有人能帮我找出此实现不起作用的原因: //fitsBits: return 1 if x can be represented as an n-bit, two's complement integer. //1<=n<=32 //Examples: fitsBits(5,3)=0, fitsBits(-4,3)=1 //legal ops: ! ~ & ^ | + << >> //Max
//fitsBits: return 1 if x can be represented as an n-bit, two's complement integer.
//1<=n<=32
//Examples: fitsBits(5,3)=0, fitsBits(-4,3)=1
//legal ops: ! ~ & ^ | + << >>
//Max ops: 15
int fitsBits(int x, int n) {
int mask = ~(1<<31);
return !(((x>>1)&mask)>>(~(~n+2)+1));
}
您所写的看起来像C,其中-ve数字的右移是实现定义的,所以可能是算术移位,也可能不是算术移位。对于左移,情况更糟,-ve值的结果未定义。所以,最好是在没有签名的情况下做所有狡猾的事情 对于2的补码,n位。。。+ve数字必须从第n-1位开始全部为“0”,而-ve数字必须全部为“1”。。。因此,在C中,假设所有无符号32位整数都没有填充
m = UINT_MAX << (n - 1) ; // bits from n-1 upwards
q = - (x >> 31) ; // all sign bits, assuming 32bit integers
return ((x ^ q) & m) == 0 ;
后来添加
…我承认我并没有努力找出你的代码:
int fitsBits(int x, int n)
{
int mask = ~(1<<31);
return !(((x>>1)&mask)>>(~(~n+2)+1));
}
考虑到转换int值的困难,可能正在尝试这样做。但是,假设掩码最终为0x7FFFFFFF,并且x>>1是简单移位或算术移位,则:
x> >1&掩码是一个简单的1移位,如unsignedx>>1
~n+2是~n+1+1是-n+1,因为我们假设2是补码
~n+2+1是-~n+2是--n+1是n-1
所以,x>>1&mask>>~~n+2+1是无符号的x>>1>>n-1是鼓轮
。。。未签名的X>>n
…这是为了在n位字段中存储x而要丢弃的所有位
如果您想测试x是否适合无符号n位字段,那么unsignedx>>n==0就可以了
要测试有符号x是否适合有符号n位字段,需要考虑无符号x>>n-1的值,该值必须为零或0xFFFFFFFF>>n-1,具体取决于x的符号
顺便提一下,我注意到要求是1
int fitsBits(int x, int n)
{
int mask = ~(1<<31);
return !(((x>>1)&mask)>>(~(~n+2)+1));
}