知识点:
1.位与运算(&或者and)
相同位的两个数字都为1,则为1;若有一个不为1,则为0。(不考虑进位)
00101
11100
----------------
00100
2.异或运算(^)
如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。在二进制运算中结果如下(不考虑进位)
00101
11100
----------------
3.shl运算 (<<)
a shl b就表示把a转为二进制后左移b位(在后面添b个0)。例如100的二进制为1100100,而110010000转成十进制是400,那么100 shl 2 = 400。可以看出,a shl b的值实际上就是a乘以2的b次方,因为在二进制数后添一个0就相当于该数乘以2。
通常认为a shl 1比a * 2更快,因为前者是更底层一些的操作。因此程序中乘以2的操作请尽量用左移一位来代替。
运算思路
一.将二进制运算分解成两部分 a+b=a^b+(a&b)<<1
1.异或运算 各个权值相等的位进行相加 此部分是没有进位的部分,进位的部分用0代替
例 0110 (十进制 6)
0010
(十进制 2)
-----------------------
0100
(十进制 4)
2 位与运算 通过位与运算得到两数相加中哪些权位进行了进位 在二进制运算中 向下一权位进1,即为原2进制的权位×2,
例 0110 (十进制 6)
0010 (十进制 2)
#include<iostream>
using namespace std;
int main()
{
int a = 6, b = 2;
int c = a ^ b;
int d = a & b;
cout<<"初始c d 的值"<<endl;
cout<<"c="<<c<<endl;
cout<<"d="<<d<<endl;
while(d) //这里以进不进位作为循环的终结
{
int a = c;
int b = d << 1;
cout<<"循环中 a b 变化"<<endl;
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
c = a ^ b;
d = a & b;
cout<<"c="<<c<<endl;
cout<<"d="<<d<<endl;
}
printf("res = %d\n", c);
return 0;
;
}
-----------------------
代表权值为2的位产生了进位,产生的进位的数值为0100 (用0010<<1得到)
将这两部分相加可得到第一步的结果
二.
将产生的两部分运算结果分别与输入的结果a,b进行替换,进行重复的运算操作,直到没有进位为止,得到最终结果