使用按位运算符的算术运算符

时间:2012-11-08 06:15:33

标签: c++ c

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

3 个答案:

答案 0 :(得分:4)

您可以搜索算术运算符的某些硬件设计。另外举例来说,你可以找到全加器,半加器,然后是波纹进位加法器,进位保存加法器,带前瞻加法器。然后,您可以生成大量代码,以使用逐位运算符来执行这些算术运算。

答案 1 :(得分: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)。

(a-b)位反转 b 并将初始进位设置为1时发生减法。

但是,如果必须并行添加32个数字,则可以使用所有这些数字的32个lsbs来匹配“a”并并行执行二进制运算。这是一种称为位切片的技术。

对于乘法CSA(进位保存加法器绝对是最好的软件方法 - 它具有最小的“区域”)

作为练习,这是一个并行计算+ 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);
}

答案 2 :(得分:0)

请注意bitwise中的C运算符仅适用于integral operands而不适用于arithmetic 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)为任意位数添加两个整数