#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
程序员面试金典: 9.5位操作 5.3给定正整数,找出与其二进制表示中1的个数相同、且大小最接近的两个数
本文介绍了如何通过位操作找到与给定正整数二进制表示中1的个数相同、但大小最接近的两个数。关键在于位运算技巧,包括如何拆分数字、改变特定位、查找1和0的位置等。通过示例代码展示了如何实现这一过程。
摘要由CSDN通过智能技术生成