题目:对于一个字节(8bit)的无符号变量,求其二进制表示中“1”的个数,要求算法的执行效率尽可能高。
思路一:从十进制转化为二进制的方法中获得启发,可以余2然后判断是否为一,是则加一,再将该数除2继续之前的判断操作。
思路二:将余2和除2操作用位操作&和>>来表示,使得效率更加快
思路三:判断一个数是否为2的幂次可以用v&(v - 1)来求解,比如v = 1000000,则v-1 = 0111111,此时v与v-1所有位上的数都不相同,显然可以用v&(v-1)是否为0来判断v是否为 2的幂次,根据此思路,可以算出1的位数,复杂度是该数中1的个数
思路四:用空间换时间的策略,8字节的变量,总共也就128个数,将这128个结果列成一个数组直接打出来即可,然后可以根据索引求值
思路二:将余2和除2操作用位操作&和>>来表示,使得效率更加快
思路三:判断一个数是否为2的幂次可以用v&(v - 1)来求解,比如v = 1000000,则v-1 = 0111111,此时v与v-1所有位上的数都不相同,显然可以用v&(v-1)是否为0来判断v是否为 2的幂次,根据此思路,可以算出1的位数,复杂度是该数中1的个数
思路四:用空间换时间的策略,8字节的变量,总共也就128个数,将这128个结果列成一个数组直接打出来即可,然后可以根据索引求值
扩展问题: