获得两个整形二进制表达位数不同的数量

这是一道小米校招真题

题目描述

世界上有10种人,一种懂二进制,一种不懂。那么你知道两个int32整数m和n的二进制表达,有多少个位(bit)不同么?

输入例子:
1999 2299
输出例子:
7
 1 class Solution {
 2 public:
 3 /**
 4 * 获得两个整形二进制表达位数不同的数量
 5 *
 6 * @param m 整数m
 7 * @param n 整数n
 8 * @return 整型
 9 */
10
11 int countBitDiff(int m, int n) {
12
13 }
14 };

目的是补全这块。通用的方法就不再赘述,下面提供一种位运算方法简便解决此题。

解决方法:

 1 int countBitDiff(int m, int n) {
 2        int res=m^n;
 3         int count=0;
 4         while(res){
 5             count++;
 6             res=res&(res-1);
 7         }
 8         return count;
 9
10     }
11 }

解析:

m和n进行异或运算以后得到res(2个数的位相同的时候为0不同为1),所以res的位中1的个数就是answer,然后进行循环对res中的1的个数计数,通过与运算

res=res&(res-1);将res中最右边的1置0(提示:res右边起的0进行与运算一定还为0,直到res最右边的1,与res-1进行与运算的时候,res-1会发生借位,res的那个1变成0,右边的0全置1,则变成了1和0与为0,把结果赋值给res完成最右边的1置0操作),依次循环直到全为0,count便存完了原来res中1的个数。
时间: 2024-10-27 02:30:53

获得两个整形二进制表达位数不同的数量的相关文章

两个int整数m和n的二进制表达有多少个位不同

题目描述 世界上有10种人,一种懂二进制,一种不懂.那么你知道两个int32整数m和n的二进制表达,有多少个位(bit)不同么? 输入例子: 1999 2299 输出例子: 7 题目分析 二进制中,统计两个数的相应位(bit)相同可以采用异或操作,异或运算结果相同为0不同为1.所以两个数异或的结果中1就是相同位数. public static int count(int a, int b) { int m = a ^ b; int num = 0; while(m>0) { m &= (m-

世界上有10种人,一种懂二进制,一种不懂。那么你知道两个int32整数m和n的二进制表达,有多少个位(bit)不同么? 输入例子: 1999 2299 输出例子: 7

这是小米2015年暑假实习生第一道笔试题,其实不难,主要用到移位操作和或运算符就可以搞定,具体代码如下: /*世界上有10种人,一种懂二进制,一种不懂.那么你知道两个int32整数m和n的二进制表达,有多少个位(bit)不同么? 输入例子: 1999 2299 输出例子: 7 */ #include<stdio.h> int countBitDiff(int m, int n) { int data=1; int a,b; int count=0; for(int i=0;i<31;i+

【微软100题】输入一个整数,求该整数的二进制表达中有多少个1

package test; /** 整数的二进制表示中1的个数 题目:输入一个整数,求该整数的二进制表达中有多少个1. 例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 分析: 方法一:把十进制转换成二进制字符数组,遍历该数组,判断1的个数. 方法二:对于一个int n, n&1的结果就是n转化成二进制数后的最后一位的结果.考察了位运算 包括微软在内的很多公司都曾采用过这道题. * @author Zealot * */ public class MS_28 { private

交换两个整形变量的数值

#include<stdio.h> void swap(int *p3,int *p4)//定义swap函数,定义两个指针参数 { int t;// 定义一个整形t来做数据交换的中介 t=*p3; *p3=*p4; *p4=t;//3步交换 } main() { int a,b;//定义两个整形变量a,b int *p1,*p2;//定义两个指针变量p1,p2 p1=&a;//指针p1指向a p2=&b;//指针p2指向b printf("输入a,b的值:"

不借助任何中间变量将两个整形变量的值交换

今天在做题的时候,突然出现一道题,就是不借助中间变量,将两个整形变量的值互换,开始有点懵,这怎么换?后来还是用两个变量不停做加减变换,差不多有十几分钟,才终于凑出来了一种方法,一时兴起,我又从网上找了一下相关的资料,说是竟然有四种方法,我就看了一下,顺便学习一下. 在我们初学阶段,一般是定义一个新的变量,借助它完成交换. 例如:int a,b;a=1; b=2;int t;t=a; a=b; b=t;这种算法易于理解,对初学者来说,一般都是用“空瓶子来回倒换”帮助理解的,而且是赋值语句的经典应用

两个整形变量的内容交换(初)

两个整形变量的内容交换(初) #include<stdio.h> int main() { int a; int b; int tem; tem=a; a=b; b=tem; printf("a=%d",a); printf("b=%d",b); return 0; }

蓝桥杯 算法训练 ALGO-151 6-2递归求二进制表示位数

算法训练 6-2递归求二进制表示位数 时间限制:10.0s   内存限制:256.0MB 问题描述 给定一个十进制整数,返回其对应的二进制数的位数.例如,输入十进制数9,其对应的二进制数是1001,因此位数是4. 样例输入 一个满足题目要求的输入范例.9 样例输出 与上面的样例输入对应的输出. 数据规模和约定 输入数据中每一个数的范围. 例:输入在int表示范围内. 题目解析: 在 Java 的 Integer 类的方法中,有将十进制数转换为二进制.八进制和十六进制的三个方法.若参数为正整数,则

【c语言】 &nbsp; 交换两个整形变量的值(要求不创建临时变量)

如何不创建临时变量,来交换两个整形变量的值 异或运算 #include<stdio.h> int main() { int num1=12,num2=24;     printf("交换前的变量值");     printf("%d,%d",num1,num2);       num1=num1^num2;       num2=num1^num2;       num1=num1^num2;//异或  printf("\n交换后的变量值&qu

关于求出两个整形数组不同元素,要求效率最高

由于两个数组,一比较就会出现两次for循环,所以我能想到的就是组合求出现次数,这样子,就不会出现两次for循环,上代码,希望有看到的提出更好的方法 1 #include <iostream> 2 using namespace std; 3 4 void printarray(int *arr, int size) 5 { 6 if (arr == nullptr) 7 { 8 return; 9 } 10 cout << endl; 11 for (int i = 0; i &l