Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <limits.h>
- #include <stdio.h>
- #include <stdlib.h>
- typedef unsigned long U;
- void print_bits(U n)
- {
- unsigned char *b = (unsigned char *)&n;
- for (size_t i = sizeof(U); i --> 0; ) // предположим, что маленький конечный вход
- for (size_t j = CHAR_BIT; j --> 0; ) // для каждого бита
- printf("%u", (b[i] >> j) & 1u); // вывод j-того элемента
- puts("");
- }
- int main(void)
- {
- size_t n, nbits = sizeof(U) * CHAR_BIT;
- if (scanf("%zu", &n) != 1 || n > nbits)
- exit(EXIT_FAILURE);
- U v = (n < nbits) ? ((U)1 << n) - 1 : -1; //установить N наименее значащих бит
- print_bits(v);
- U last = n ? -1 ^ (((U)1 << (nbits - n)) - 1) : 0; // установить N наиболее значащих бит
- while (v != last) {
- U t = v | (v - 1); // t получает наименее значимые значения v, равные 1 бит
- //следующие перестановки бит
- v = (t + 1) | (((~t & -~t) - 1) >> (__builtin_ctzl(v) + 1));
- print_bits(v);
- }
- }
- #include <iostream>
- #include <iomanip>
- #include <limits>
- using namespace std;
- template<typename T,
- typename = enable_if<is_unsigned<T>::value && is_integral<T>::value>::type>
- T nextBits(T x)
- {
- T s = x & -x;
- T r = s + x;
- r = r|(((x^r)>>2)/s);
- return (r > x) ? r : T{};
- }
- template<typename T,
- typename = enable_if<is_unsigned<T>::value && is_integral<T>::value>::type>
- T ones(size_t n)
- {
- if (n == 0 || n > CHAR_BIT*sizeof(T)) return T{};
- T x = 1;
- for(size_t i = 1; i < n; ++i) x = (x<<1)|1;
- return x;
- }
- template<typename T,
- typename = enable_if<is_unsigned<T>::value && is_integral<T>::value>::type>
- void out(T n)
- {
- for(size_t i = CHAR_BIT*sizeof(T); i > 0; --i)
- {
- cout << ((n & (1 << (i-1))) ? '1' : '0');
- }
- cout << endl;
- }
- int main(int argc, const char * argv[])
- {
- size_t n;
- cin >> n;
- unsigned long x = ones<unsigned long>(n);
- while(x)
- {
- out(x);
- x = nextBits(x);
- }
- }
Add Comment
Please, Sign In to add comment