Lul*_*Cow 1 c binary bit-manipulation twos-complement
可能重复:
如何仅使用位移和加法进行乘法和除法?
我必须编写函数来执行二进制减法,乘法和除法,而不使用除循环控制之外的任何算术运算符.我之前只用Java编写代码,所以我很难绕过这个问题.
从减法开始,我需要用原型编写一个函数
int bsub(int x, int y)
Run Code Online (Sandbox Code Playgroud)
我知道我需要将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;
}
Run Code Online (Sandbox Code Playgroud)
好吧,在没有+或-运算符的情况下减去按位运算有点棘手,但可以完成.你有补充的基本想法,但不使用+它变得有点棘手.
您可以通过首先仅按位设置添加来执行此操作,然后使用它,您可以执行减法操作.哪个用于补码,所以代码如下所示:
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));
}
Run Code Online (Sandbox Code Playgroud)
然后如果我们在一个例子中使用上面的代码:
int main(){
printf("%d\n", bsub(53, 17));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
最终返回36.这就是减法如何仅按位运算.
然后乘法和除法变得更复杂,但可以完成; 对于这两个操作,使用移位以及加法和/或减法来完成工作.您可能还想阅读此问题以及有关如何执行此文章的文章.