把第一个过0的1设成0,最后一个0设成1,再把其他数按小的放即为last
把第一个过1的0设成1,最后一个1设成0,再把其他数按大的放即为next
/*Given an integer, print the next smallest and next largest number that have the same
number of 1 bits in their binary representation
*/
#include <iostream>
#include <string>
#include <bitset>
using namespace std;
bitset<16> findnext(bitset<16> n){
int i = 0;
int count = 0;
while(i<15){
if(n[i] == 1)
count++;
if(count > 0 && n[i] == 0){
n.set(i);
for(int j = 0; j<count-1; j++)
n.set(j);
for(int j = count-1; j<i; j++)
n.reset(j);
break;
}
i++;
}
return n;
}
bitset<16> findlast(bitset<16> n){
int i = 0;
int count = 0;
while(i<15){
if(n[i] == 0)
count++;
if(count > 0 && n[i] == 1){
n.reset(i);
for(int j = 0; j<count-1; j++)
n.reset(j);
for(int j = count-1; j<i; j++)
n.set(j);
break;
}
i++;
}
return n;
}
int main(){
bitset<16> n (string("11100"));
cout<<findnext(n)<<endl;
cout<<findlast(n)<<endl;
bitset<16> k (string("10011"));
cout<<findnext(k)<<endl;
cout<<findlast(k)<<endl;
}