给定一个正整数,找出一个数:与其二进制表示中1的个数相同,比该数大,而且最接近
2015-05-06 21:35
387 查看
#include <iostream> using namespace std; int getNext(int n) { int t = n; int c0 = 0; int c1 = 0; while ((t & 1) == 0 && (t != 0)) { c0++; t >>= 1; } while ((t & 1) == 1) { c1++; t >>= 1; } if (c0 + c1 == 31 || c0 + c1 == 0)//32位整数,111..000形式,找不到比他大,而且二进制1的个数一样 { return -1; } int p = c0 + c1; n |= (1 << p);//翻转最右边的非拖尾0(就是该0后面紧跟的是1),0变1,数字变大,1个数+1,0个数-1 n &= ~((1 << p) - 1);//把最右边的非拖尾0右边所有数字清0 n |= (1 << (c1 - 1)) - 1;//最右边c1-1个数字变成1,因为前面把一个0变成了1,现在1的个数少了1个,为了要让数字大的情况下尽可能小,1要靠右边 return n; } int main() { cout << getNext(20) << endl;//20的二进制10100变成11000,即24 getchar(); return 0; }
相关文章推荐
- 给定一个正整数,找出一个数:与其二进制表示中1的个数相同,比该数小,而且最接近
- 给定一个正整数,找出与其二进制表示中1的个数相同,且大小最接近的那两个数
- 9.5位操作(三)——给定一个正整数,找出与其二进制表示中1的个数相同,且大小最接近的那两个数
- 程序员面试金典: 9.5位操作 5.3给定正整数,找出与其二进制表示中1的个数相同、且大小最接近的两个数
- 程序员面试金典--面试27之有一个正整数,请找出其二进制表示中1的个数相同、且大小最接近的那两个数
- 给定一个整数N,找出一个比N大且最接近N,但二进制权值与该整数相同 的数
- 给定一个正整数的二进制表示
- 找出二进制表示中1的个数相同,且大小最接近的那两个数
- 求给定一个正整数的二进制表示
- 使用Haskell计算一个正整数二进制表示中最大的连续的1的个数
- 将一个正整数用二进制表示
- 给定一个数组,按序排列,从数组找出若干个数,使得这若干个数字的和与M最为接近,(背包问题)
- 任意给定一个大于等于10的整数A,请写一程序,以最小的时间复杂度找出比A小并且最接近A的一个整数B。要求:A的每位之和与B的每位之和相等 例:如果A=123 那么B=114
- 一个正整数有可能可以表示为n(n>=2)个连续的正整数之和,如:15=1+2+3+4+5,15=4+5+6,15=7+8 请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。
- 给定一个实数数组,按序排列(从小到大),从数组从找出若干个数,使得这若干个数的和与M最为接近,描述一个算法,并给出算法的复杂度。
- 如何高效的结算一个正整数中二进制表示1的个数
- 给定一个数字的十进制形式,求出用二进制表示次数时,其中bit位为1的个数
- 将一个正整数N用二进制表示并转换为一个String类型的值S
- 任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0。
- 任意给定一个正整数N,求一个最小的正整数M(M>1),使得N*M的十进制表示形式里只含有1和0。