题目描述

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

题解:

1717(0110 1011 0101),下一位是 1718(0110 1011 0110)

767(0010 1111 1111),下一位是 895(0011 0111 1111)

348(0001 0101 1100),下一位是 355(0001 0110 0011)

其中不难发现一个规律,从右起的第一个“01”改变为“10”,并且在“01”的后面所有的“1”都移动至最后,事实上,这个就是解题的关键点,那么整个问题求解的核心就转移到这两个子问题:

1. 将右起第一个“01”,改变为“10”

2. 将该“01”后面的所有“1”移动至最后

 1 #include <cstdlib>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <cstdio>
 5 #include <cmath>
 6 #include <iostream>
 7 #include <vector>
 8 #include<string>
 9 #include<cstring>
10 #include<string.h>
11 #include<set>
12 #include<queue>
13 #include<stack>
14 #include<map>
15 using namespace std;
16 typedef long long LL;
17
18 int main()
19 {
20     int n;
21     while(cin>>n)
22     {
23        int b=n&(-n);// 得到n中最后一个‘1’到最后的值
24        int t=n+b; // 产生进位, 实现‘01’ 变成 ‘10’
25        int s=t^n;   // 得到进位中发生变动的位
26        int k=(s>>2)/b;//先 ‘01’->'10'发生后不要去改变这两位,所以右移2位,然后将‘01’以后的‘1’移动到最后。
27        int n=t|k; // 最后的结果就是t|k
28        cout<<n<<endl;
29     }
30     return 0;
31 }

转载于:https://www.cnblogs.com/wangmengmeng/p/5185483.html

Same binary weight (位运算)相关推荐

  1. 【LeetCode从零单排】No 191.Number of 1 Bits(考察位运算)

    题目 Write a function that takes an unsigned integer and returns the number of '1' bits it has (also k ...

  2. 进制转换 位运算(包括补码、原码、反码、~0等一些零碎东西一次说清)

    我发现网上关于标题上的内容介绍的都很零碎,因此为了方便查找.也为了本人对这一部分的充分理解,就想着写一篇这样的博客(我分成了几个部分,以便查找): 一.进制转换 让我们先来看看各个进制的定义: 十进制 ...

  3. 0x01.基本算法 — 位运算

    目录 一.位运算 二.memset函数 三.移位运算 四.二进制状态压缩 五.成对变换 六.lowbit 七.相关习题 0.AcWing 26. 二进制中1的个数 1.Acwing 89. a^b(快 ...

  4. C语言中的位运算和逻辑运算

    位运算 C语言中的位运算包括与(&),或(|),亦或(^),非(~). 下面的代码包扩了这些基本运算,还有一个两个数的交换(不用第三个数). #include<stdio.h> # ...

  5. 《算法竞赛进阶指南》打卡-基本算法-AcWing 91. 最短Hamilton路径:位运算、状态压缩dp、dp

    文章目录 题目解答 题目链接 题目解答 分析: 状态压缩dp是用二进制数来表示状态. 数据范围n = 20, 那么状态总量就是2202^{20}220个状态. 可以按照以下思路去思考: 哪些点被用过 ...

  6. 位运算,处理前台多选值

    前言: 本周,公司有个需求,需要对前台一个多选值进行存储,实现过程中,想过三种方案,在这里记录下. 方案一(使用多个布尔值):  在最开始,多选值只有两个,就打算用两个布尔值分开存储的,实现和使用都很 ...

  7. 快速排序算法_基于位运算的快速排序算法

    前言 如果你准备看这篇文章,我就当你是懂快速排序算法原理的. 下面是我在2018年10月3日想到的基于二进制位运算对正整数进行的一种快速排序算法,目前的代码只能对正整数进行有效的排序,当然,稍微修改一 ...

  8. Java从入门到精通08-二进制、位运算、移位运算

    Java从入门到精通08-二进制.位运算.移位运算 二进制(Binary)数用0和1两个数字及其组合来表示任何数.进位规则是"逢2进1",数字1在不同的位上代表不同的值,按从右到左 ...

  9. python 十进制与二进制以及位运算

    From: http://blog.sina.com.cn/s/blog_681de30a01013uiw.html 在python2.6以上的版本中自带了将十进制转化为二进制的函数bin(). 看一 ...

最新文章

  1. 【怎样写代码】工厂三兄弟之抽象工厂模式(二):解决方案
  2. python可视化:matplotlib学习笔记
  3. oracle 无效对象,Oracle编译用户无效对象
  4. 浅谈Java中的final关键字
  5. Git使用方法——原创
  6. Lidar SLAM | 地面三维激光雷达测试报告
  7. Bug只让变量生效一次的思路
  8. leetcode39. 组合总和
  9. 第二十一届国际C语言混乱代码大赛结果公布
  10. [scikit-learn 机器学习] 8. 非线性分类和决策树
  11. SQL Server 数据加密功能解析
  12. mysql索引方式_MySQL数据库的索引方式
  13. php arff文件,python实现txt文件格式转换为arff格式
  14. pat1057 stack
  15. 关于Linux进程优先级数字混乱的彻底澄清
  16. python移动文件(非文件夹)
  17. 2021年安全员-A证报名考试及安全员-A证考试报名
  18. Golang 协程 跟Java NIO
  19. 【报告分享】2021懂车帝经销商直播价值白皮书-懂车帝x巨量算数(附下载)
  20. python 获取csv的列数_《极限挑战》弹幕及评论情感分析(Python)

热门文章

  1. struts2上传图片的全过程
  2. DZX2无法读取会员短消息
  3. 行为型模式:命令模式
  4. QuickBI助你成为分析师——数据源FAQ小结
  5. [vijos1234]口袋的天空最小生成树
  6. 运行ceph时,了解一下主要的进程。
  7. 设计模式六大原则(6)——开闭原则
  8. 十五天精通WCF——第八天 对“绑定”的最后一点理解
  9. 配置Exchange OWA和Sharepoint网站单点登录
  10. CCNA基础知识汇总