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));
  }