Guest User

Untitled

a guest
Dec 18th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.04 KB | None | 0 0
  1. #include <limits.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. typedef unsigned long U;
  6.  
  7. void print_bits(U n)
  8. {
  9. unsigned char *b = (unsigned char *)&n;
  10. for (size_t i = sizeof(U); i --> 0; ) // предположим, что маленький конечный вход
  11. for (size_t j = CHAR_BIT; j --> 0; ) // для каждого бита
  12. printf("%u", (b[i] >> j) & 1u); // вывод j-того элемента
  13. puts("");
  14. }
  15.  
  16. int main(void)
  17. {
  18. size_t n, nbits = sizeof(U) * CHAR_BIT;
  19. if (scanf("%zu", &n) != 1 || n > nbits)
  20. exit(EXIT_FAILURE);
  21.  
  22. U v = (n < nbits) ? ((U)1 << n) - 1 : -1; //установить N наименее значащих бит
  23. print_bits(v);
  24.  
  25. U last = n ? -1 ^ (((U)1 << (nbits - n)) - 1) : 0; // установить N наиболее значащих бит
  26. while (v != last) {
  27. U t = v | (v - 1); // t получает наименее значимые значения v, равные 1 бит
  28. //следующие перестановки бит
  29. v = (t + 1) | (((~t & -~t) - 1) >> (__builtin_ctzl(v) + 1));
  30. print_bits(v);
  31. }
  32. }
  33.  
  34. #include <iostream>
  35. #include <iomanip>
  36. #include <limits>
  37.  
  38. using namespace std;
  39.  
  40. template<typename T,
  41. typename = enable_if<is_unsigned<T>::value && is_integral<T>::value>::type>
  42. T nextBits(T x)
  43. {
  44. T s = x & -x;
  45. T r = s + x;
  46. r = r|(((x^r)>>2)/s);
  47. return (r > x) ? r : T{};
  48. }
  49.  
  50. template<typename T,
  51. typename = enable_if<is_unsigned<T>::value && is_integral<T>::value>::type>
  52. T ones(size_t n)
  53. {
  54. if (n == 0 || n > CHAR_BIT*sizeof(T)) return T{};
  55. T x = 1;
  56. for(size_t i = 1; i < n; ++i) x = (x<<1)|1;
  57. return x;
  58. }
  59.  
  60. template<typename T,
  61. typename = enable_if<is_unsigned<T>::value && is_integral<T>::value>::type>
  62. void out(T n)
  63. {
  64. for(size_t i = CHAR_BIT*sizeof(T); i > 0; --i)
  65. {
  66. cout << ((n & (1 << (i-1))) ? '1' : '0');
  67. }
  68. cout << endl;
  69. }
  70.  
  71. int main(int argc, const char * argv[])
  72. {
  73. size_t n;
  74. cin >> n;
  75. unsigned long x = ones<unsigned long>(n);
  76. while(x)
  77. {
  78. out(x);
  79. x = nextBits(x);
  80. }
  81. }
Add Comment
Please, Sign In to add comment