程序员面试金典: 9.5位操作 5.3给定正整数,找出与其二进制表示中1的个数相同、且大小最接近的两个数

本文介绍了如何通过位操作找到与给定正整数二进制表示中1的个数相同、但大小最接近的两个数。关键在于位运算技巧,包括如何拆分数字、改变特定位、查找1和0的位置等。通过示例代码展示了如何实现这一过程。
摘要由CSDN通过智能技术生成
#include <iostream>
#include <stdio.h>
#include <string>
#include <vector>
#include <stack>
#include <sstream>

using namespace std;

/*
问题:给定一个正整数,找出与其二进制表示中1的个数相同、且大小最接近的那两个数(一个略大,一个略小)

输入:
11100111
10011
10010
111
输出
11011110, 11101011
1110(略小的数) ,10101(略大的数)
10001 , 10100
No Less Number , 1011 

关键部分:
1 位运算中关键技巧:
  技巧1:以第i位将一个数拆num分上高位部分和低位部分,然后高位部分和低位部分分别进行操作,最后将操作后的高位部分和
         低位部分进行或运算,即可得到最终运算结果
		 低位第i位以下部分全为1的掩模lowMask= 1 << i - 1;
		 高位第i位及以上部分全为1的掩模highMask = ~( (1 << i) - 1 )
		 低位lowNum = num & lowMask
		 高位highNum = num & highMask
  技巧2:将数num的第i位变成0:
                              highMask = ~( 1 << (i + 1) - 1 );注意高位部分的掩模不含第i位本身,则第i位变成0
                              lowMask= 1 << i - 1; 然后利用技巧1获取高位数和低位数部分进行处理
							  int lowNumber = num & lowMask;
							  int highNumber = num & highMask;
							  int result = highNumber | lowNumber;
         将数num的第i位变成1:num != (1 << position); 【另第i位变成1】,变为1只需要与2^i进行或运算
		 将数num的第i位之后全变成0:只需要与一个最后i位都为0,前面都为1的数做与运算
		                           mask = ( (~0) << i )
		 将数num前面n位设置为1,后面m位设置为0:
		                       先生成n个1,然后向左移动m位
							   mask = (1 << n) -1;
							   mask <<= m;
							   num |= mask
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值