Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 查找重叠1位的计数_C++_Algorithm - Fatal编程技术网

C++ 查找重叠1位的计数

C++ 查找重叠1位的计数,c++,algorithm,C++,Algorithm,我试图找出两个给定数字之间重叠的1位的数目 例如,给定5和6: 5 // 101 6 // 110 有1个重叠的1位(第一位) 我有以下代码 #include <iostream> using namespace std; int main() { int a,b; int count = 0; cin >> a >> b; while (a & b != 0) { count++;

我试图找出两个给定数字之间重叠的1位的数目

例如,给定
5
6

5 // 101
6 // 110
有1个重叠的1位(第一位)

我有以下代码

#include <iostream>
using namespace std;

int main() {
    int a,b;
    int count = 0;
    cin >> a >> b;
    while (a & b != 0) {
        count++;
        a >>= 1;
        b >>= 1;
    }
    cout << count << endl;

    return 0;
}
#包括
使用名称空间std;
int main(){
INTA,b;
整数计数=0;
cin>>a>>b;
而(a&b!=0){
计数++;
a>>=1;
b>>=1;
}

cout您现有的算法将每个位的计数长度与剩余位中的任何位的计数长度相同,以测试匹配情况;因为123和335有一个公共MSB,所以只要其中一个数字不为零,则为真。123是较小的7位,因此在该数字完全处理之前为真7倍。作为极端情况,128(10000000)和255(11111111)将使用您的方法返回8,即使它实际上是1


您希望将这两个数字加在一起,然后计算结果中的1数

您现有的算法将每一位的长度计算为剩余位中的任何一位,以测试匹配情况;由于123和335有一个公共MSB,因此只要其中一个数不为零,则是正确的。123是较小的数,有7位,因此是正确的7倍直到这个数字被完全处理。作为一个极端情况,128(10000000)和255(11111111)将在您的方法中返回8,即使它实际上是1


你想把这两个数字加在一起,然后计算结果中的1个数

问题是,你只是在打印出任何一个位匹配的次数,因为你在每次迭代中删掉最低有效位(最大值是为较小的数字设置的位数)。每次迭代都要对[a]和[b]的所有位进行逐位比较。您可以通过使用1:
a&b&1
掩蔽来纠正这一点,这样,当您每次向右移动对象位时,您只检查是否检查了最低有效位:

while (a && b){
    count += a & b & 1;
    a>>=1;
    b>>=1;
}

问题在于,您只是打印出任何位匹配的次数,因为每次迭代都会删除最低有效位(最大值为较小数字设置的位数)。您正在按位比较[a]和[b]的所有位每次迭代。您可以通过使用1:
a&b&1
掩蔽来纠正这一点,这样,当您每次向右移动对象位时,您只检查是否正在检查最低有效位:

while (a && b){
    count += a & b & 1;
    a>>=1;
    b>>=1;
}

您需要计算设置的位数,而代码是计算二进制对数

仅当设置了最低阶位时才增加计数

for (int c = a & b; c != 0; c >>= 1) {
  if (c & 1)
    ++count;
}

您需要计算设置的位数,而代码是计算二进制对数

仅当设置了最低阶位时才增加计数

for (int c = a & b; c != 0; c >>= 1) {
  if (c & 1)
    ++count;
}
略短的形式:

int countCommonBits(int a,int b) {    
    int n = 0;
    for (unsigned v = (unsigned)(a & b); v; v >>= 1) {
        n += 1 & v;
    }
    return n;
}
如果您知道两个数字都是正数,则可以省略无符号类型的使用。请注意,当使用“int”时,负数右移的符号扩展将导致一点过计数(即无限循环)

很久以后…… 回顾一个旧答案时,发现了这个问题。当前的“已接受”答案1)效率低下,2)如果数字为负数,则是一个无限循环。FWIW。

略短一些:

int countCommonBits(int a,int b) {    
    int n = 0;
    for (unsigned v = (unsigned)(a & b); v; v >>= 1) {
        n += 1 & v;
    }
    return n;
}
如果您知道两个数字都是正数,则可以省略无符号类型的使用。请注意,当使用“int”时,负数右移的符号扩展将导致一点过计数(即无限循环)

很久以后……
回顾一个旧的答案,发现了这个。当前的“已接受”答案是1)效率低下,2)如果数字为负数,则是一个无限循环。FWIW.

335二进制=101001111;123二进制=001111011。在我看来是4。你的算法是错误的-你只需要将两个值相加,然后对结果进行总体计数。我认为值得指出的是,这个问题本质上是问如何计算计算
hammingWeight(a&b)
。这里有一些关于如何计算汉明权重的好答案:335二进制=101001111;123二进制=001111011。在我看来好像是4。你的算法不正确-你只需要将两个值相加,然后对结果进行总体计数。我认为值得指出的是,这个问题本质上是问如何计算
hammingWeight(a&b)
这里有一些很好的答案来计算Hamming Weight:第一句话不是严格正确的;85(01010101)和170(10101010)将输出0,因为它们没有共同点。他正在打印最重要匹配位的偏移量。第一句话不是严格正确的;85(01010101)和170(10101010)将输出0,因为它们没有共同点。为了清晰起见,他正在打印最重要的匹配bitI的偏移量,如Marcs答案,但这一个更好,操作更少(我希望此版本作为等效的while循环完成,但这是个人偏好).为了清晰起见,我更喜欢MACS答案,但这一个更适合较少的操作(我希望此版本作为等效的while循环完成,但这是个人偏好)。