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

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;
}
        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值