• 编程之美Ex1——求二进制中1的个数


    又被阿里机考虐了一次,决定改变策略开始刷题T^T

     

    一个字节(8bit)的无符号整型,求其二进制中的“1”的个数,算法执行效率尽可能高。

    最先想到的移位操作,末尾位&00000001,然后右移,算法复杂度为O(log(v))

     1 #include "stdafx.h"
     2 #include <iostream>
     3 using namespace std;
     4 
     5 int Count(int v);
     6 int main()
     7 {
     8     int v = 255;
     9     int num = Count(v);
    10     cout<<num<<endl;
    11     return 0;
    12 }
    13 
    14 int Count(int v)
    15 {
    16     int num = 0;
    17     while(v)
    18     {
    19         num += v &0x01;
    20         v >>= 1;
    21     }
    22     return num;
    23 }

    还有一种算法复杂度为O(1)的,就是利用查表法,空间来换取时间,经典的理念。

    http://blog.csdn.net/justpub/article/details/2292823

    但是,看了上述博客后,发现弊端,这个操作需要访问内存,运行时间比法一长很多。

    【扩展】:给定两个正整数(二进制表示)A和B,问把A变成B需要改变多少位,也就是说,两者的二进制表示中有多少位不同?

    取一个C = A^B,C中1的个数就是A和B不同的位数。

     

  • 相关阅读:
    Java基础——消息队列
    Java基础——缓存
    Java基础——动态代理
    Java基础——克隆
    Java基础——锁
    Java基础——线程池
    Java基础——线程
    Java基础——HashMap
    Java基础——String
    SpringMVC的学习____5.乱码问题的解决_两种方法(两个类)
  • 原文地址:https://www.cnblogs.com/Big-Rabbit/p/4399774.html
Copyright © 2020-2023  润新知