taki luźny pomysł bo jak ręcznie liczę to mi zły wynik wychodzi i algorytm nie efektywny
#include <iostream>
#include <vector>
#include <bitset>
using namespace std;
using unv=vector<unsigned>;
unv setonce (const unsigned & x ) {
unv v;
unsigned mask=(1<<(sizeof(unsigned)*8-1));
while (mask) {
if(x&mask) v.push_back(mask);
mask>>=1;
}
return v;
}
unv setzero (const unsigned & x ) {
unv v;
unsigned mask=(1<<(sizeof(unsigned)*8-1));
while (!(mask&x)) {
mask>>=1;
}
while (mask) {
if(x&mask);
else v.push_back(mask);
mask>>=1;
}
return v;
}
int main() {
unsigned mask=(1<<31);
unsigned x=0b101;
unsigned liczba =0b101010101010111;
unv onesmask=setonce(x);
unv zerosmask=setzero(x);
int licznik=0;
cout<<bitset<sizeof(unsigned)*8>(x)<<endl;
for(const auto & xv:onesmask) {
cout<<bitset<sizeof(unsigned)*8>(xv)<<endl;
}
cout<<endl<<string(30,'/')<<endl;
for(const auto & xv:zerosmask) {
cout<<bitset<sizeof(unsigned)*8>(xv)<<endl;
}
cout<<endl<<string(30,'*')<<endl;
unsigned first=*onesmask.begin();
while (liczba>=first) {
bool true1=1;
for(auto xv:onesmask) {
if(liczba&xv);
else true1=0;
}
for(auto xv:zerosmask) {
if(liczba&xv) {
true1=0;
}
}
cout<<true<<string(30,45)<<endl;
if(true1) licznik++;
liczba>>=1;
}
cout<<"\n\nlicznk="<<licznik<<endl;
return 0;
}
Jednak lepiej na sub stringu zrobić.