美文网首页
[05]二进制个位不同个数-吉比特2018秋

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

作者: jdzhangxin | 来源:发表于2018-10-21 18:15 被阅读28次

    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 <bits/stdc++.h>
    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 <bits/stdc++.h>
    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)&num;// 每次去除1位
      }
      printf("%d\n",count);
    }
    

    牛客题目

    相关文章

      网友评论

          本文标题:[05]二进制个位不同个数-吉比特2018秋

          本文链接:https://www.haomeiwen.com/subject/aglwoftx.html