位是数据存储的最小单位,在计算机中的二进制系统,每个0或者1就是一个位(bit)
位操作:
1.&(按位与) ----> 真真为真
2.|(按位或) ----> 假假为假
3.^(按位异或) —> 不同为真,相同为假
4.~(按位取反) —> 0为1,1为0
5.>>(按位右移) —> 把二进制位整体右移 —— 右移等于除了2的N次方,N是右移的位数
6.<<(按位左移) —> 把二进制位整体左移 —— 左移等于乘了2的N次方,N是左移的位数
A+B
分析:
确定需要进位 1+1 = 2 A:0000 0001 B:0000 0001 C:0000 0010 A&B:0000 0001,当A和B某一位相同时(都是1),那么下次计算需要进位 • 1 • 2 • 3 • 4 • 5 • 6
确定不需要进位 1+2 = 3 A:0000 0001 B:0000 0010 C:0000 0011 A&B:0000 0000 == 0,即当A&B == 0时,不需要进位 • 1 • 2 • 3 • 4 • 5 • 6
不需要进位的时候,如何得到结果? 1+2 = 3 A:0000 0001 B:0000 0010 使用A&B:0000 0000确定不需要进位, 当某一位是1的时候,需要保存下来,则使用^(按位异或) A^B:0000 0011 == 3 此时得到想要的结果 • 1 • 2 • 3 • 4 • 5 • 6 • 7 • 8
需要进位的时候,如何得到结果? 1+3 = 4 A:0000 0001 B:0000 0011 C:0000 0100 使用A&B:0000 0001的知,最后一位需要进位 使用<<(按位左移)得到一个进位后的C ———— (A&B)<<1 : 0000 0010 使用^(按位异或)得到原值不需要进位的部分D ———— (A^B) : 0000 0010 此时,将C与D重复上述操作 直到,&(按位与)的结果是0 ,说明没有进位了,也说明计算结束了 • 1 • 2 • 3 • 4 • 5 • 6 • 7 • 8 • 9 • 10 • 11 • 12
代码实现
#include <iostream> using namespace std; int main() { int A,B; while(cin>>A&&cin>>B) { int flag1 = A&B; int flag2 = A^B; while(flag1 > 0) { int C = flag1<<1; int D = flag2; flag1 = C&D; flag2 = C^D; } cout << flag2 << endl; } return 0; }