用位运算解决进制转化问题

Same binary weight

时间限制: 300  ms  |  内存限制: 65535  KB
难度: 3
描述

The binary weight of a positive  integer is the number of 1's in its binary representation.for example,the decmial number 1 has a binary weight of 1,and the decimal number 1717 (which is 11010110101 in binary) has a binary weight of 7.Give a positive integer N,return the smallest integer greater than N that has the same binary weight as N.N will be between 1 and 1000000000,inclusive,the result is guaranteed to fit in a signed 32-bit interget.

输入
The input has multicases and each case contains a integer N.
输出
For each case,output the smallest integer greater than N that has the same binary weight as N.
样例输入
1717
4
7
12
555555
样例输出
1718
8
11
17
555557
分析:这道题题意是给你一个数N把它转化成二进制以后1的个数称为The binary weight of N,求和该数有相同1的个数
的二进制中最小的那个十进制数。主要运用了c++库函数中的next_permutation函数,我之所以收藏这道题,因为用位运算就是很巧妙的把一个十进制转化成了二进制。
下面简单介绍一下这道题用到的位运算&,和<<.
1,<<的优先级高于&的优先级。
2,&运算就是对应位都是1是结果为1.
3,<<就是左移运算,2<<3=2*pow(2,3),16>>4=16/pow(2,4),pow(2,i)=1<<i;
 
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int get_binary(int n)
{  vector<int>bits(32,0); 
   for(int i=0;i<32;i++)
    if(n&1<<i)//每次让2的i次方和n进行与运算从而判断出该位存0,还是存1.
       bits[31-i]=1; 
       next_permutation(bits.begin(),bits.end());//找出比n大的最小的那个数。
       int sum=0;
       for(int i=0;i<32;i++)
             if(bits[i])
             sum+=bits[i]<<(31-i);//计算二进制中不为0时,该位的权值。
             return sum;
}
int main()
{     int n;
        
      while(cin>>n)
     {    
        
             cout<<get_binary(n)<<endl;
     }return 0;
}
        


你可能感兴趣的:(用位运算解决进制转化问题)