Binary 补码是分配的吗?
我知道它是关联的和可交换的: 就是Binary 补码是分配的吗?,binary,Binary,我知道它是关联的和可交换的: 就是 (~x1 + ~x2) + ~x3 = ~x1 + (~x2 + ~x3) 及 但是,对于我尝试的案例,它似乎不是分布的,即 ~x1 + ~x2 != ~(x1 + x2) 这是真的吗?有证据吗 我的C代码如下: int n1 = 5; int n2 = 3; result = ~n1 + ~n2 == ~(n1 + n2); int calc = ~n1; int calc0 = ~n2; int calc1 = ~n1 + ~n2; i
(~x1 + ~x2) + ~x3 = ~x1 + (~x2 + ~x3)
及
但是,对于我尝试的案例,它似乎不是分布的,即
~x1 + ~x2 != ~(x1 + x2)
这是真的吗?有证据吗
我的C代码如下:
int n1 = 5;
int n2 = 3;
result = ~n1 + ~n2 == ~(n1 + n2);
int calc = ~n1;
int calc0 = ~n2;
int calc1 = ~n1 + ~n2;
int calc2 = ~(n1 + n2);
printf("(Part B: n1 is %d, n2 is %d\n", n1, n2);
printf("Part B: (calc is: %d and calc0 is: %d\n", calc, calc0);
printf("Part B: (calc1 is: %d and calc2 is: %d\n", calc1, calc2);
printf("Part B: (~%d + ~%d) == ~(%d + %d) evaluates to %d\n", n1, n2, n1, n2, result);
这将提供以下输出:
Part B: (n1 is 5, n2 is 3
Part B: (calc is: -6 and calc0 is: -4
Part B: (calc1 is: -10 and calc2 is: -9
Part B: (~5 + ~3) == ~(5 + 3) evaluates to 0
发件人:
发件人:
查看维基百科上的文章。补码中的加法具有末端进位,必须将溢出位添加到最低位 由于
~
(NOT)在“一”的补语中等于-
(否定),我们可以将其改写为:
-x1 + -x2 = -(x1 + x2)
这是正确的。请查看上的WikieDia文章。补码中的加法具有末端进位,必须将溢出位添加到最低位 由于
~
(NOT)在“一”的补语中等于-
(否定),我们可以将其改写为:
-x1 + -x2 = -(x1 + x2)
这是正确的。在固定宽度寄存器中,一个人的赞美词用于表示负数和正数。要在添加过程中分发,必须应用以下内容:
~a+~b
=~(a+b)
。OP状态+
表示添加“两个二进制数”。这本身是模糊的,但是如果我们认为它意味着添加无符号二进制数,那么不,一个人的赞美是不可分配的
请注意,在一个人的赞美语中有两个零:所有的位都是一或所有的位都是零
检查以查看~0+~0!=~(0+0)
:
~0
为零。但是,~0
由所有的表示。将其自身相加就是将其加倍(与左移位相同),从而在右手数字中引入零。但这不再是两个零中的一个
然而,0
是零,0+0
也是零,因此~(0+0)
也是零。但是左边不是零,所以to分布不成立
另一方面。。。考虑两个恭维:翻转所有的位并加上一个。如果在一个人的恭维语中特别注意否定,那么“二元加法”的版本类似于两个人的恭维语,并且是分布的,因为你最终得到了一个熟悉的,就像两个人的恭维语一样
前面提到的关于处理加法的更多细节,以允许预期的算术行为。一个人的称赞用于表示固定宽度寄存器中的负数和正数。要在添加过程中分发,必须应用以下内容:
~a+~b
=~(a+b)
。OP状态+
表示添加“两个二进制数”。这本身是模糊的,但是如果我们认为它意味着添加无符号二进制数,那么不,一个人的赞美是不可分配的
请注意,在一个人的赞美语中有两个零:所有的位都是一或所有的位都是零
检查以查看~0+~0!=~(0+0)
:
~0
为零。但是,~0
由所有的表示。将其自身相加就是将其加倍(与左移位相同),从而在右手数字中引入零。但这不再是两个零中的一个
然而,0
是零,0+0
也是零,因此~(0+0)
也是零。但是左边不是零,所以to分布不成立
另一方面。。。考虑两个恭维:翻转所有的位并加上一个。如果在一个人的恭维语中特别注意否定,那么“二元加法”的版本类似于两个人的恭维语,并且是分布的,因为你最终得到了一个熟悉的,就像两个人的恭维语一样
前面提到的关于处理加法的更多细节,以允许预期的算术行为。[我知道这真的很旧,但我有同样的问题,而且因为上面的答案相互矛盾…] “一”的赞美确实是分配给加法的。代码中的问题(以及Kaganar的善意但不正确的回答)是,您正在丢弃进位——您可以用两个s的恭维,但不能用一个s的恭维 用于存储和的内容需要比求和内容更多的内存空间,这样就不会丢失进位。然后将进位折叠回用于存储操作数的位数,以获得正确的和。在一个人的恭维算术中,这被称为“端转进位” 来自维基百科的文章(“\u补充): 要将这个系统中表示的两个数字相加,一个进行常规的二进制加法,但随后需要进行一次端到端的进位:即,将任何结果进位加回到结果和中。要了解为什么这是必要的,请考虑下面的示例,说明添加的情况−1(11111110)至+2(00000010): 在前面的示例中,第一个二进制加法得到00000000,这是不正确的。正确的结果(00000001)仅在进位加回时出现 我对你的代码做了一点修改,使自己更容易做一个理智的检查和测试。使用有符号整数数据类型可能需要更多的考虑,或者考虑到端到端借用而不是携带。我没有走那么远,因为我的应用程序都是关于校验和的(即,无符号,仅限加法)
[我知道这真的很老了,但我有同样的问题,因为上面的答案是矛盾的…] “一”的赞美确实是分配给加法的。代码中的问题(以及Kaganar的善意但不正确的回答)是,您正在丢弃进位——您可以用两个s的恭维,但不能用一个s的恭维 用于存储和的内容需要比求和内容更多的内存空间,这样就不会丢失进位。然后将进位折叠回用于存储操作数的位数,以获得正确的和。在一个人的恭维算术中,这被称为“端转进位” 来自维基百科的文章
-x1 + -x2 = -(x1 + x2)
binary decimal
11111110 –1
+ 00000010 +2
─────────── ──
1 00000000 0 ← Not the correct answer
1 +1 ← Add carry
─────────── ──
00000001 1 ← Correct answer
unsigned short n1 = 5; //using 16-bit unsigned integers
unsigned short n2 = 3;
unsigned long oc_added = (unsigned short)~n1 + (unsigned short)~n2; //32bit
/* Fold the carry bits into 16 bits */
while (oc_added >> 16)
oc_added = (oc_added & 0xffff) + (oc_added >> 16);
unsigned long oc_sum = ~(n1 + n2); //oc_sum has 32 bits (room for carry)
/* Fold the carry bits into 16 bits */
while (oc_sum >> 16)
oc_sum = (oc_sum & 0xffff) + (oc_sum >> 16);
int result = oc_added == oc_sum;
unsigned short calc = ~n1;
unsigned short calc0 = ~n2;
unsigned short calc1 = ~n1 + ~n2; //loses a carry bit
unsigned short calc2 = ~(n1 + n2);
printf("(Part B: n1 is %d, n2 is %d\n", n1, n2);
printf("Part B: (calc is: %d and calc0 is: %d\n", calc, calc0);
printf("Part B: (calc1 is: %d and calc2 is: %d\n", calc1, calc2);
printf("Part B: (~%d + ~%d) == ~(%d + %d) evaluates to %d\n", n1, n2, n1, n2, result);