对签名类型编号的NOT(〜)按位运算符

时间:2015-07-01 13:08:20

标签: c++ bit-manipulation bit

我很难理解not(~)运营商如何处理有效签名号码。

作为一个例子 - -ve数字存储在2的赞美

int a=-5; 
cout<<bitset<32>(a)<<endl;  // 11111111111111111111111111111011
cout<<bitset<32>(~a)<<endl; // 00000000000000000000000000000100
cout<<(~a)<<endl; // 4

4是预期输出

int a=5;
cout<<bitset<32>(a)<<endl;  // 00000000000000000000000000000101
cout<<bitset<32>(~a)<<endl; // 11111111111111111111111111111010
cout<<(~a)<<endl; // -6

怎么来-6?

3 个答案:

答案 0 :(得分:2)

按位非(~x == -(x+1) )运算符基本上可以概括为以下

-

原因是因为否定(一元-x == (~x) + 1)一般使用2's complement

将二进制补码定义为按位,然后加一个即+ 1。简单地将-1转换到另一边,然后使用负号的分布属性(即乘法的分配属性,特别是在这种情况下使用-x == (~x) + 1 // Due to way negative numbers are stored in memory (in 2's complement) -x - 1 == ~x // Transposing the 1 to the other side -(x+1) == ~x // Distributing the negative sign ),我们得到了等式。

更具数学意义:

var GetHashCodeNumber = function (n: number): number {
         //create 8 byte array buffer number in js is 64bit 
         var arr = new ArrayBuffer(8);

         //create view to array buffer
         var dv = new DataView(arr);

         //set number to buffer as 64 bit float  
         dv.setFloat64(0, n);

         //now get first 32 bit from array and convert it to integer
         // from offset 0
         var c = dv.getInt32(0);

         //now get next 32 bit from array and convert it to integer 
         //from offset 4 
         var d = dv.getInt32(4);

         //XOR first end second integer numbers 
         return c ^ d;
     }

答案 1 :(得分:2)

C ++标准只表示二进制NOT运算符(〜)翻转用于表示值的所有位。这对整数值的意义取决于机器使用的位的解释。 C ++标准允许以下三种有符号整数表示:

  • sign + magnitde:有一个符号位,后跟编码幅度的位。
  • 一个补码:想法是通过翻转x的所有位来表示-x。这类似于符号+幅度,其中在负值情况下幅度比特全部被翻转。所以,1 ... 1111将是-0,1 ... 1110将是-1,1 ... 1101将是-2等等......
  • two's complement:此表示删除两个可能的零编码之一,并在低端添加一个新值。在二进制补码1 ... 1111表示-1,1 ... 1110表示-2,依此类推。所以,与一个人的补充相比,它基本上是向下移动的。

现在,两个补充是很多更受欢迎。据我所知,X86,X64,ARM,MIPS都使用这种表示形式来签名。你的机器显然也使用了两个补码,因为你观察到~5是-6。

如果你想保持100%的可移植性,你不应该依赖于二进制补码表示,只能在无符号类型上使用这些类型的运算符。

答案 2 :(得分:0)

这是由于计算机如何理解签名号码。 取一个字节:8位。

1(强者)用于设计

7为数字 作为一个整体: 所以从-128到+127

负数: -128到-1

表示正数:0到127。

不需要有两个0的数字,因此,还有一个负数。