6

有没有办法只使用按位运算符来执行加法(或算术运算)?

4

3 回答 3

4

您可以搜索算术运算符的一些硬件设计。例如,您可以找到全加器、半加器、然后是波纹进位加法器、进位保存加法器、进位超前加法器。然后,您可以生成大量代码以使用按位运算符来执行这些算术运算。

于 2012-11-08T06:18:50.027 回答
3

添加a、b 和 c

carry_out = b&c|a&b|a&c;  // there's a carry, if at least 2 bits are set
sum = a^b^c;              // the sum is the number of set bits modulo 2

必须对字中的所有位执行此操作 - 首先使用 carry_in = c = 0 对位 0 执行此操作,然后迭代到 carry_in(next_bit) = carry_out(previous_result)。

减法发生在将 (ab) 中的 b 位反转并将初始位设置为 1 时。

但是,如果必须并行添加例如 32 个数字,则可以将 'a' 与所有这些数字的 32 lsb 相匹配并并行执行二进制运算。这是一种称为位切片的技术。

对于乘法 CSA(进位保存加法器绝对是最好的软件方法——它的“面积”最小)

作为练习,这是一个并行计算 a+b(+c) 的算法:

int a = 13113;
int b = 43334;
int c =     1;

int main()
{
   int sum=a^b^c,c2;
   c=((c&a)|(a&b)|(c&b))<<1;
   while (c) {
     c2=(c&sum)<<1;
     sum^=c;
    c=c2;
   }
   printf("%d\n",sum);
}
于 2012-11-08T06:24:17.053 回答
0

注意bitwise运算符 inC只适用于integral operandsnot onarithmetic operands

是的,您可以将其bitwise用于所有操作(+,-,*,/,%)

例如

int a =10;
a<<1; // it's multiplication : a*2
a>>1; //it's division : a/2

我只展示了这个2。您可以使用FULL ADDER (SUM and CARRY functios)任意数量的位来添加两个整数

于 2012-11-08T06:31:48.893 回答