仅使用按位运算符执行二进制算术运算

可能重复:
如何仅使用位移和加法进行乘法和除法?

我必须编写函数来执行二进制减法,乘法和除法,而不使用除循环控制之外的任何算术运算符。 我之前只用Java编写代码,所以我很难绕过这个问题。

从减法开始,我需要用原型编写一个函数

int bsub(int x, int y) 

我知道我需要将y转换为二的补码以使其为负并将其添加到x,但我只知道如何通过使用一个补码运算符并添加1来实现这一点,但我不能使用+运算符。

提供了badd函数,如果我能弄清楚如何制作负数,我将能够在bsub中实现它。 badd的代码如下所示。 提前感谢任何提示。

 int badd(int x,int y){ int i; char sum; char car_in=0; char car_out; char a,b; unsigned int mask=0x00000001; int result=0; for(i=0;i<32;i++){ a=(x&mask)!=0; b=(y&mask)!=0; car_out=car_in & (a|b) |a&b; sum=a^b^car_in; if(sum) { result|=mask; } if(i!=31) { car_in=car_out; } else { if(car_in!=car_out) { printf("Overflow occurred\n"); } } mask<<=1; } return result; } 

好吧,在没有+-运算符的情况下减去按位运算有点棘手,但可以完成。 你有补充的基本想法,但没有使用+它变得有点棘手。

您可以通过首先仅按位设置添加来执行此操作,然后使用它,您可以执行减法操作。 哪个用于补码,所以代码如下所示:

 int badd(int n1, int n2){ int carry, sum; carry = (n1 & n2) << 1; // Find bits that are used for carry sum = n1 ^ n2; // Add each bit, discard carry. if (sum & carry) // If bits match, add current sum and carry. return badd(sum, carry); else return sum ^ carry; // Return the sum. } int bsub(int n1, int n2){ // Add two's complement and return. return badd(n1, badd(~n2, 1)); } 

然后如果我们在一个例子中使用上面的代码:

 int main(){ printf("%d\n", bsub(53, 17)); return 0; } 

最终返回36 。 这就是减法如何仅按位运算。

然后乘法和除法变得更复杂,但可以做到; 对于这两个操作,使用移位以及加法和/或减法来完成工作。 您可能还想阅读此问题以及有关如何执行此文章的文章 。

您必须首先实现二进制加法:

4位示例:

a = 1101 b = 1011

掩模的范围从0001到1000

 for (i=0;i<4;i++) { x = a & pow(2, i); //mask, you can shift left as well y = b & pow(2, i); z = x ^ y; //XOR to calculate addition z = z ^ carry; //add previous carry carry = x & y | x ^ carry | y ^ carry; //new carry } 

这是伪代码。 掩码允许从左到右逐位操作。 您必须将z方便地存储到另一个变量中。

一旦你有了加法,你将能够通过1'实现并加1来实现减法。

乘法也是一样的,但稍微困难一些。 基本上它是你在学校学到的相同的划分方法,使用掩码方便地选择位并使用上面的添加添加中间结果。

分区有点复杂,需要更多时间来解释,但基本上它是相同的原则。