逻辑运算
1-或运算 (|)一真则真 11001000 01110011 11111011 2-与运算(&)都为真则真 11001000 01110011 01000000 3-异或运算 (^) 不相同则为真 11001000 01110011 10111011 4-非运算(!) 真为假 假为真 11001000 00110111
通过逻辑运算实现加法(以下1 和 0都是二进制)
3 2 = ? 3 的二进制是0011 2 的二进制是0010 二进制加法是异或运算 1 1 = 0(对应位相加 不考虑进位) 0 1 = 1 ;0 0 = 0 实现运算 1 1 = 0是不行的,必须要进位 进位如何表示 才可以把 1 1 =10 表示出来 首先 1 1在什么情况下 = 1 是与运算 与运算完成后 再进行一次左移(<<) 就可以得到进位。 n1 n2 = n1 ^ n2 (n1 & n2)<<1 继续 3 2 先进行一次异或(^)->0001 再进行一次与(&)->0010 并进行一次左移(<<)->0100 (b)0001 100= ?现在计算的已经不是 3 2 两个数字 而是异或后的数字和进位制 进位制没有归零 说明我们的计算还需要递归继续计算 只有进位制归零 计算过程才算结束 异或第二次(^)->101 再进行与运算100(<<)000 我们可以发现进位制已经清零,这意味着我们加法和进位都已经计算完毕 我们验证一下对错 5 = 101 = 我们计算的结果
代码实现
代码语言:javascript复制#include <stdio.h>
#pragma warning(disable : 4996)
int numeber1, number2;
int main()
{
//scanf("%d%d", &numeber1, &number2);
printf("%d", add(101, 100));
}
int add(int n1, int n2)
{
if (n1 ==0)
{
return n2;
}
if (n2 != 0)//判断是否需要进位
{
int xor = n1 ^ n2;
int carry = (n1 & n2) << 1;
n1 = xor;
n2 = carry;
return add(xor, carry);//如果需要进位 则继续执行程序直到没有进位
}
else
{
return n1;
}
}