假设您有两个数字,都是有符号整数,并且您想要对它们求和,但不能使用您的语言的常规+和 - 运算符。你会怎么做?
答案 0 :(得分:5)
不是我的,但很可爱
int a = 42;
int b = 17;
char *ptr = (char*)a;
int result = (int)&ptr[b];
答案 1 :(得分:3)
使用按位操作,就像Adder Circuits
一样答案 2 :(得分:3)
畏缩。没有人再从1位加法器构建加法器。
do {
sum = a ^ b;
carry = a & b;
a = sum;
b = carry << 1;
} while (b);
return sum;
当然,这里的算术假设是无符号模2 n 或二进制补码。如果转换为无符号,则仅保证在C中工作,执行无符号计算,然后转换回签名。
答案 3 :(得分:2)
由于++
和--
不是+
和-
运营商:
int add(int lhs, int rhs) {
if (lhs < 0)
while (lhs++) --rhs;
else
while (lhs--) ++rhs;
return rhs;
}
答案 4 :(得分:1)
使用按位逻辑:
int sum = 0;
int carry = 0;
while (n1 > 0 || n2 > 0) {
int b1 = n1 % 2;
int b2 = n2 % 2;
int sumBits = b1 ^ b2 ^ carry;
sum = (sum << 1) | sumBits;
carry = (b1 & b2) | (b1 & carry) | (b2 & carry);
n1 /= 2;
n2 /= 2;
}
答案 5 :(得分:1)
这里的内容与已经发布的内容有所不同。使用以下事实:
log (a^b) = b * log a
e^a * e^b = e^(a + b)
所以:
log (e^(a + b)) = log(e^a * e^b) = a + b (if the log is base e)
所以只需找到log(e^a * e^b)
。
当然这只是理论上的,在实践中,这将是效率低下的,而且很可能也是不精确的。
答案 6 :(得分:0)
答案 7 :(得分:0)
此版本对数字范围有限制:
(((int64_t)a << 32) | ((int64_t)b & INT64_C(0xFFFFFFFF)) % 0xFFFFFFFF
这也属于“规则函”类别。
答案 8 :(得分:0)
在Common Lisp中:
(defun esoteric-sum (a b)
(let ((and (logand a b)))
(if (zerop and)
;; No carrying necessary.
(logior a b)
;; Combine the partial sum with the carried bits again.
(esoteric-sum (logxor a b) (ash and 1)))))
这是数字的按位和,它表示需要携带哪些位,如果没有需要移位的位,则返回按位 - 或操作数的em>否则,它将所携带的位向左移动,并再次将它们与数字的按位异或 - 组合,这些数字将所有不需要携带的位相加,直到不再携带是必要的。
这是上面递归形式的迭代替代方法:
(defun esoteric-sum-iterative (a b)
(loop for first = a then (logxor first second)
for second = b then (ash and 1)
for and = (logand first second)
until (zerop and)
finally (return (logior first second))))
请注意,该函数需要另一个让步克服 Common Lisp不愿意使用固定宽度的二进制补码算法 - 通常是一个不可估量的资产 - 但我宁愿不用这个函数来形成函数的形式意外的复杂性。
如果您需要有关为什么有效的详细信息,请提出更详细的问题来探讨该主题。
答案 9 :(得分:0)
Python中的简单示例,完成一个简单的测试:
NUM_BITS = 32
def adder(a, b, carry):
sum = a ^ b ^ carry
carry = (a & b) | (carry & (a ^ b))
#print "%d + %d = %d (carry %d)" % (a, b, sum, carry)
return sum, carry
def add_two_numbers(a, b):
carry = 0
result = 0
for n in range(NUM_BITS):
mask = 1 << n
bit_a = (a & mask) >> n
bit_b = (b & mask) >> n
sum, carry = adder(bit_a, bit_b, carry)
result = result | (sum << n)
return result
if __name__ == '__main__':
assert add_two_numbers(2, 3) == 5
assert add_two_numbers(57, 23) == 80
for a in range(10):
for b in range(10):
result = add_two_numbers(a, b)
print "%d + %d == %d" % (a, b, result)
assert result == a + b
答案 10 :(得分:0)
我知道,但不是很有创意,但在Python中:
和([A,B])
答案 11 :(得分:0)
我意识到这可能不是问题最优雅的解决方案,但我想出了一种方法,使用len(list)函数替代加法运算符。
'''
Addition without operators: This program obtains two integers from the user
and then adds them together without using operators. This is one of the 'hard'
questions from 'Cracking the Coding Interview' by
'''
print('Welcome to addition without a plus sign!')
item1 = int(input('Please enter the first number: '))
item2 = int(input('Please eneter the second number: '))
item1_list = []
item2_list = []
total = 0
total_list = []
marker = 'x'
placeholder = 'placeholder'
while len(item1_list) < item1:
item1_list.append(marker)
while len(item2_list) < item2:
item2_list.append(marker)
item1_list.insert(1, placeholder)
item1_list.insert(1, placeholder)
for item in range(1, len(item1_list)):
total_list.append(item1_list.pop())
for item in range(1, len(item2_list)):
total_list.append(item2_list.pop())
total = len(total_list)
print('The sum of', item1, 'and', item2, 'is', total)
答案 12 :(得分:0)
#include <stdio.h>
int main()
{
int n1=5,n2=55,i=0;
int sum = 0;
int carry = 0;
while (n1 > 0 || n2 > 0)
{
int b1 = n1 % 2;
int b2 = n2 % 2;
int sumBits = b1 ^ b2 ^ carry;
sum = sum | ( sumBits << i);
i++;
carry = (b1 & b2) | (b1 & carry) | (b2 & carry);
n1 /= 2;
n2 /= 2;
}
sum = sum | ( carry << i );
printf("%d",sum);
return 0;
}