我必须将 1 加到 C 中的数字上。我必须在没有算术运算符(如 '+'、'++'、.. 等)的情况下执行此操作。
我写了以下代码行。
int a = 1234;
int b = 1;
printf("%d", a ^ b);
这工作正常,直到达到整数限制,即,对于 32 位,它是 4294967295。但我在许多其他网站上看到,为了执行相同的操作,他们对两个数字进行 AND,然后是 XOR 和左移。
请建议我的方法是否正确,因为我是 C 新手。
我必须将 1 加到 C 中的数字上。我必须在没有算术运算符(如 '+'、'++'、.. 等)的情况下执行此操作。
我写了以下代码行。
int a = 1234;
int b = 1;
printf("%d", a ^ b);
这工作正常,直到达到整数限制,即,对于 32 位,它是 4294967295。但我在许多其他网站上看到,为了执行相同的操作,他们对两个数字进行 AND,然后是 XOR 和左移。
请建议我的方法是否正确,因为我是 C 新手。
你的方法不正确。您应该使用+
在 C 中添加数字:
int a = 1234;
int b = 1;
printf("%d\n", a + b); // Prints 1235
您对您的方法说“这在达到整数限制之前可以正常工作”,但您错了。当a
是奇数时,^
运算的结果是减一:
int a = 1235;
int b = 1;
printf("%d\n", a ^ b); // Prints 1234
printf("%d\n", a + b); // Prints 1236, using the correct operator
在这里您可以看到您当前使用的方法不适用于奇数。
在这种方法中,您没有进行精确的加法。但它看起来像。
a = 00000000 00000000 00000100 11010010
b = 00000000 00000000 00000000 00000001
------------------------------------------
a^b = 00000000 00000000 00000100 11010011
------------------------------------------
^ this bit is toggled
例如,当您尝试对 3 与 1234 进行异或运算时,您将得到输出为 1233。因为异或运算
a = 00000000 00000000 00000100 11010010
b = 00000000 00000000 00000000 00000011
------------------------------------------
a^b = 00000000 00000000 00000100 11010001
------------------------------------------
^ here this bit is toggled.
当您使用 XOR 进行加法时,这并不意味着您正在添加。所以请记住这一点并进行必要的操作!
^
用于执行 XOR 操作,并+
用于执行“加”操作。
我强烈建议+
执行任何类型的添加操作,例如两个数字的总和,或者一个数字的减法和另一个数字的负数,或者以一定数量增加一个变量的值。
++
此外,可以通过使用一元运算符将变量的值精确地增加“1” :x++
相当于x = x + 1
.
此外,还+=
可以使用运算符,它将变量增加右侧指定的数量:x += 1
。
如果幸运的话,可以选择一个任意的运算符,比如说<OPER>
,并写一些表达式,比如x <OPER> <FREAK OPERAND>
and ,从而获得变量“加 1”的效果。
但随后可能难以将这种方法推广到更复杂的情况(例如,“加 2”操作)。