我正在研究这个问题并提出一个解决方案(可能需要添加一个或两个条件)但不确定这是否是正确的方法并且发现使用两个循环很麻烦并且不确定这是否是这样做的有效方法。如果有人有一些不错的技巧或任何更好的方法会受到欢迎,那就太好了:)。(语言不是障碍)
我的算法:
- 首先找到数字中的第一个 '0' lsb 位
- 然后找到与此“0”位相邻的下一个设置位
- 将您找到的“0”位更改为 1,将“1”位更改为“0”
- 你会得到的数字是下一个
- 如果设置了所有位,那么您没有任何数字小于相同数量的“1”位。
void nextSmaller(int number) {
int firstZeroBitHelper = 1, nextOneBitHelper;
while (firstZeroBitHelper < number) {
// when we find first lsb zero bit we'll stop
bool bit = number & firstZeroBitHelper;
if (bit == false)
break;
firstZeroBitHelper = firstZeroBitHelper << 1;
}
if (firstZeroBitHelper >= number) {
cout << "No minimum number exists" << endl;
return;
}
nextOneBitHelper = firstZeroBitHelper;
nextOneBitHelper = nextOneBitHelper << 1;
while (nextOneBitHelper < number) {
// when we get '1' after the previous zero we stop
bool bit = number & nextOneBitHelper;
if (bit == true)
break;
nextOneBitHelper = nextOneBitHelper << 1;
}
// change the first zero to 1
number = number | firstZeroBitHelper;
// change the next set bit to zero
number = number & ~nextOneBitHelper;
cout << number << endl;
}