Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有符号类型编号上的NOT(~)位运算符_C++_Bit Manipulation_Bit - Fatal编程技术网

C++ 有符号类型编号上的NOT(~)位运算符

C++ 有符号类型编号上的NOT(~)位运算符,c++,bit-manipulation,bit,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

我很难理解
not(~)
操作符如何处理正符号数

例如,ve数字存储在2的恭维语中

int a=-5; 
cout<<bitset<32>(a)<<endl;  // 11111111111111111111111111111011
cout<<bitset<32>(~a)<<endl; // 00000000000000000000000000000100
cout<<(~a)<<endl; // 4
inta=-5;
cout按位not(
~
)运算符基本上可以概括如下

~x == -(x+1)
这是因为否定(一元
-
)通常使用

2的补码定义为取按位not,然后加1,即
-x==(~x)+1
。将
+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
按位not(
~
)运算符基本上可以概括如下

~x == -(x+1)
这是因为否定(一元
-
)通常使用

2的补码定义为取按位not,然后加1,即
-x==(~x)+1
。将
+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

这是由于计算机如何理解有符号的数字。 取一个字节:8位

1(强者)用于设计

号码是7 整体而言: 所以从-128到+127

对于负数: -128比1

对于正数:0到127


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

这是由于计算机如何理解有符号的数字。 取一个字节:8位

1(强者)用于设计

号码是7 整体而言: 所以从-128到+127

对于负数: -128比1

对于正数:0到127


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

< P> C++的标准只说二进制非算符(~)翻转所有用来表示值的位。这对整数值意味着什么取决于机器使用的位的解释。C++标准允许符号整数的以下三种表示:

  • sign+magnitde:有一个符号位,后跟编码幅度的位
  • 一的补充:这个想法是通过翻转x的所有位来表示-x。这类似于符号+幅度,在负数情况下,幅度位都翻转。所以,1…1111将是-0,1…1110将是-1,1…1101将是-2,依此类推
  • :此表示法删除零的两种可能编码之一,并在下端添加一个新值。在二的补码中,1…1111表示-1,1…1110表示-2,依此类推。所以,它基本上是一个移位,相对于一个补码
如今,两个补语更受欢迎。据我所知,X86、X64、ARM和MIPS都使用这种符号表示法。你的机器显然也使用2的补码,因为你观察到~5是-6


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

< P> C++的标准只说二进制非操作符(~)翻转所有用来表示值的位。这对整数值意味着什么取决于机器使用的位的解释。C++标准允许符号整数的以下三种表示:

  • sign+magnitde:有一个符号位,后跟编码幅度的位
  • 一的补充:这个想法是通过翻转x的所有位来表示-x。这类似于符号+幅度,在负数情况下,幅度位都翻转。所以,1…1111将是-0,1…1110将是-1,1…1101将是-2,依此类推
  • :此表示法删除零的两种可能编码之一,并在下端添加一个新值。在二的补码中,1…1111表示-1,1…1110表示-2,依此类推。所以,它基本上是一个移位,相对于一个补码
如今,两个补语更受欢迎。据我所知,X86、X64、ARM和MIPS都使用这种符号表示法。你的机器显然也使用2的补码,因为你观察到~5是-6


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

你是如何得到~x==-(x+1)的方法的,你能证明吗?还要注意,
~
等同于否定。但int a=5不是-ve,而是cout@JerryGoyal:有符号数是否为负数取决于其MSB(最高有效位)。如果它是1,那么数字被理解为是,否则,它被理解为在2的补码中…如果int a=5和int a=-5,那么这两个数字都将存储在2的补码中还是只存储在后一个补码中?因为couthow你是如何得出~x==-(x+1)的方法的,你能证明它吗?还要注意,
~
等同于否定。但是int a=5不是-ve和cout@JerryGoyal:有符号数是否为负数取决于其MSB(最高有效位)。如果它是1,那么数字被理解为是,否则,它被理解为在2的补码中…如果int a=5和int a=-5,那么这两个数字都将存储在2的补码中还是只存储在后一个补码中?因为coutas您说过NOT运算符(~)会翻转所有位,所以对于5的情况:00000000000000000000000101会翻转为11111111111111111111 010,但为什么它的值显示为-6?这是我的主要关注点,你说NOT运算符(~)翻转所有位,所以对于5的情况:00000000000000000000000101被翻转为11111111111111111111 010