《剑指offer》-[第2章:面试需要的基础知识 - 2.4:算法与数据操作- 2.4.3:位运算] 题10:二进制中1出现的次数

1、问题描述

输入一个整数,求其二进制表示中1的个数。例如,9的二进制表示位1001,其含1的个数为2。

2、解题思路

  • 思路1:如果该整数是一个正数,那么我们可以先将该整数和1进行与运算判断其二进制表示中最后一位是不是1,然后每次将整数右移一位,并将其与1进行与运算判断右移到最后一位的二进制数是不是1。但如果该整数是负数,由于负数右移后,会用符号位填补左边的空出的几位(也就是说,如果整数是正数,右移后会在左边补n个0;如果是负数,右移后就会在左边补n个1),所以可能出现死循环。
  • 思路2:既然整数右移有可能导致死循环,那是不是可以左移每次和整数进行与运算的那个数flag呢?当然可以,我们将flag初始设置成无符号的1,将flag与整数进行与运算判断其二进制表示中倒数第1位是不是1,然后将flag左移一位,同样进行与运算,判断整数倒数第2位是不是1,这样反复将flag左移,就能判断整数的二进制中的每一位是不是1。如果该整数是一个32位的整数,那么左移的次数就是32。
  • 思路3:如果把一个整数减去1,再和原整数进行位与运算,那么就会把原整数二进制表示从右往左数的第一个1变成0,该整数的二进制表示中有多少个1,就需要进行多少次这样的减1再位与操作。

3、相关题目

  • 位运算主要包括与、或、异或、左移、右移等五种运算。
  • (1)使用一条语句判断一个数是不是2的整数次方。
  • 分析:如果一个数是2的整数次方,那么其二进制表示中只有一位是1。所以如果将该整数减1再与原整数进行位与运算,二进制表示唯一的1就会变成0。判断一个整数是否是2的整数次方只需看它减一之后与原整数位与的结果是不是为零。
  • (2)输入两个整数m和n,计算需要改变m二进制表示中的多少位才能变成n,例如10的二进制表示为1001,13的二进制表示1101,要使10变成13,需要改变3位。
  • 分析:这道题实际上是在问两个整数的二进制表示中有多少位是不同的,可以先将这两个整数进行异或运算,然后通统计运算结果中1的个数。
  • (3)只出现一次的数字:在一个数组中,只有一个数字出现了一次,其他数字都出现了两次,找出这个只出现了一次的数字。
  • 分析:任何一个数和它自身异或的结果都为0,所以如果对数组中的元素依次进行异或,那么结果即为出现了一次的数字。如果是两个数字出现了一次,首先需要把这个数组分成两个数组,每个数组中都只包含一个只出现一次的数字,然后再进行异或。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Albert_YuHan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值