首页 > 试题广场 >

二进制不同位数

[编程题]二进制不同位数
  • 热度指数:2947 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}给定两个正整数 mn。将它们分别写成二进制串(不含前导 \texttt{0}),从最低位对齐后进行比较。请计算在所有对应位上二进制数字不同的位数,记为 f(m,n)

\hspace{15pt}更形式化地,设 x = m \operatorname{xor} n,则 f(m,n) 等于 x 的二进制表示中 \texttt{1} 的个数。

输入描述:
\hspace{15pt}在一行上输入两个整数 m,n\left(1\leqq m,n\leqq 10^9\right),表示需要比较的两个正整数。


输出描述:
\hspace{15pt}在一行上输出一个整数,表示 mn 的二进制表示中不同的位数 f(m,n)
示例1

输入

15 8

输出

3

说明

\hspace{15pt}在这个样例中,m=15 的二进制为 \left(1111\right)_2n=8 的二进制为 \left(1000\right)_2
\hspace{15pt}从最低位对齐后比较四个二进制位,有 3 个位置上的数字不同,因此答案为 3
示例2

输入

7 10

输出

3

说明

\hspace{15pt}在这个样例中,m=7 的二进制为 \left(111\right)_2n=10 的二进制为 \left(1010\right)_2
\hspace{15pt}补齐后比较四个二进制位:
\hspace{23pt}\bullet\,1 位(最低位):1 \neq 0
\hspace{23pt}\bullet\,2 位:1 = 1
\hspace{23pt}\bullet\,3 位:1 \neq 0
\hspace{23pt}\bullet\,4 位:0 \neq 1
\hspace{15pt}共有 3 个位置不同,故答案为 3
#include <stdio.h>
#include <stdlib.h>
int main()
{
    unsigned int x,y;
    while(scanf("%d %d",&x,&y)!=EOF)
    {
        unsigned int temp=x^y;
        int count=0;
        while(temp)
        {
            if(temp%2)
            {
                count++;
            }
            temp/=2;
        }
        printf("%d\n",count);
    }
    return 0;
}

发表于 2021-08-20 21:25:00 回复(0)
#include <stdio.h>
#include <stdlib.h>

int main(void) {
  int m, n;
  fscanf(stdin, "%d %d", &m, &n);
  return fprintf(stdout, "%d", __builtin_popcount(m ^ n)), 0;
}

发表于 2021-07-24 10:42:18 回复(0)

问题信息

上传者:小小
难度:
3条回答 4484浏览

热门推荐

通过挑战的用户

查看代码
二进制不同位数