两个二进制数之和中最右侧位产生第一个进位位的坐标


在本问题中,给出两个正整数 N 和 M。我们的任务是打印出二进制中 N 和 M 求和时生成第一个进位位的最右侧位。

举个例子来理解问题,

输入 − N = 5,M = 14

输出 − 3

说明

(5)2 = 0101 , (14)2 = 1110
Sum 0101
+   1110
    10011

要解决这个问题,我们来考虑一下布尔代数的一些观察。

当两个数字都是 1 时,求和将会产生进位。所以,我们要找出所有产生进位的位。这可以通过查找两个数字的与运算来完成。并且找到该数字的最右侧位。

这看起来有点难以理解,让我们用这种方法解决一个例子。

N = 5 and M = 14
N&M = 0100

这里最右侧的设置位在索引 3 处。

示例

程序展示了我们解决方案的实现,

 实时演示

#include <iostream>
#include <math.h>
using namespace std;
int rightSetBit(int N) {
   int bitIndex = log2(N & -N)+1;
   return bitIndex;
}
void rightCarryBit(int N, int M) {
   int carryIndex = rightSetBit(N & M);
   cout<<carryIndex;
}
int main() {
   int N=4, M=14;
   cout<<"The position of rightmost bit that generates carry in the sum of "<<N<<" and "<<M<<" is ";
   rightCarryBit(N,M);
   return 0;
}

输出

The position of rightmost bit that generates carry in the sum of 4 and 14 is 3

更新时间: 2020-4-17

82 次浏览

开启您的 职业生涯

完成课程获得认证

开始
广告