【发布时间】:2013-09-21 05:35:36
【问题描述】:
我正在研究这个问题并想出一个解决方案(可能需要添加一个或两个条件),但不确定这是否是正确的方法,并且发现使用两个循环很麻烦,而不是确定这是否是有效的方法。如果有人有一些不错的技巧可以做到这一点,或者任何更好的方法都会受到欢迎:)。 (语言不是障碍)
我的算法:
- 首先找到数字中的第一个'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;
}
【问题讨论】:
-
如果数字是 31 怎么办?您如何找到具有相同数量
1位的下一个最小的?或者我应该问,根据您的要求,下一个最小的是什么? -
@Smac89:虽然,我在练习按位运算问题时在网上找到了这个问题,但是在所有位设置的情况下,如果我找不到任何零位,我会在两者之间放置一个 if 条件在两者之间,然后返回一条消息。
-
我认为在这种情况下我们找不到具有相同数量“1”位的最小数字。
-
既然有一个很好的方法来做相反的事情(即找到下一个 更高 具有相同数量的 1 的数字),我怀疑有一个(几乎?)同样好的方法来找到下一个较小的。我去找找。。