计算二进制中1的个数

发布时间:2020-09-27 19:07:17 作者:robogo
来源:网络 阅读:501

问题:计算某个数的二进制中1的个数

思路:x = x & (x-1) 将 x 的二进制最右面的一个 1 变为 0,其余保持不变。反复操作,直到变为 0 为止,计算操作次数,即为 x 的二进制中 1 的个数。

证明:假设 x 的二进制末尾为 10...0 [末尾有 k 个 0,k = 0,1,2,...]。

则 x - 1 的二进制末尾 k+1 位为 01...1 [末尾有 k 个 1,k = 0,1,2,...],其他与 x 相同。

从而 x & (x-1) 的末尾 k+1 位为 00...0 [末尾有 k+1 个 0,k = 0,1,2,...],其他与 x 相同。

即 x = x & (x-1) 将 x 的最右边的一个 1 变为 0,其余位数无变化。

C++程序:

#include <iostream>
using namespace std;

int manyOne(int x){
    int countx = 0;
    while(x){
        ++countx;
        x = x&(x-1);
    }
    return countx;
}

int main(){
    cout<<manyOne(9999)<<endl;
    return 0;
}
//Output: 8

类似问题:x = x | (x+1) 将 x 的二进制最右面的一个 0 变为 1,其余保持不变。

证明:假设 x 的二进制末尾为 01...1 [末尾有 k 个 1,k = 0,1,2,...]。

则 x + 1 的二进制末尾 k+1 位为 10...0 [末尾有 k 个 0,k = 0,1,2,...],其他与 x 相同。

从而 x | (x+1) 的末尾 k+1 位为 11...1 [末尾有 k+1 个 1,k = 0,1,2,...],其他与 x 相同。

即 x = x | (x+1) 将 x 的最右边的一个 0 变为 1,其余位数无变化。


应用:判断一个整数 x 是否为 2 的幂。

思路:假如 x 为 2 的幂,则 x 只有最高位为 1,其余均为 0,因此按照上面的做法 x = x & (x-1) 将会为 0;反之,假如 x = x & (x-1) 为 0,则 x 只有一位为 1,其余均为 0,显然 x 为 2 的幂。

C++程序:

#include <iostream>
using namespace std;
int isTwoPow(int x){
    if( (x&(x-1)) == 0) return 1;
    else return 0;
} 
int main(){
    cout<<isTwoPow(256)<<endl;
    return 0;
}
//Output: 1


推荐阅读:
  1. 统计一个整数二进制中1的个数
  2. 二进制中1的个数

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++ 二进制

上一篇:微信小程序通过一个json实现分享朋友圈图片

下一篇:CentOS6.5环境下使用rsync增量同步备份文件的方法

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》