[05]二进制个位不同个数-吉比特2018秋

1.题目描述

输入两个整数,求两个整数二进制格式有多少个位不同。

  • 输入示例:
    22 33
    
  • 输出示例:
    5 
    

2.题目解析

  • 预备知识
    异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位,所以异或常被认作不进位加法。
    如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。

  • 解题思路:
    两个数进行异或,将异或的结果与其减一进行与操作,直至为零,就是二进制不同位数的数量。

  • 实例解释

    1. 2233进行异或。
    - 十进制数 二进制数
    a 22 10110
    b 33 100001
    55 110111
    1. 然后数一下1的个数,个数为5

3.参考答案

#include 
using namespace std;

int main(){
  int n = 0;
  int m = 0;
  scanf("%d%d",&n,&m);
  int num = n^m;
  int count = 0;
  while(num != 0){
    if(num & 0x1) ++count; // 判断右端第一位是不是1
    num = num>>1; // 右移一位
  }
  printf("%d\n",count);
}

或者

#include 
using namespace std;
int main(){
  int n = 0;
  int m = 0;
  scanf("%d%d",&n,&m);
  int num = n^m;
  int count = 0;
  while(num != 0){
    ++count;
    num = (num-1)#// 每次去除1位
  }
  printf("%d\n",count);
}

牛客题目

你可能感兴趣的:([05]二进制个位不同个数-吉比特2018秋)