我很难理解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?
答案 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 ++标准允许以下三种有符号整数表示:
现在,两个补充是很多更受欢迎。据我所知,X86,X64,ARM,MIPS都使用这种表示形式来签名。你的机器显然也使用了两个补码,因为你观察到~5是-6。
如果你想保持100%的可移植性,你不应该依赖于二进制补码表示,只能在无符号类型上使用这些类型的运算符。
答案 2 :(得分:0)
这是由于计算机如何理解签名号码。 取一个字节:8位。
1(强者)用于设计
7为数字 作为一个整体: 所以从-128到+127
负数: -128到-1
表示正数:0到127。
不需要有两个0的数字,因此,还有一个负数。