bits.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. #include <assert.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "bits.h"
  5. #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
  6. #define CHAR_ENDIAN(x) (7 - x)
  7. #define HEX_ENDIAN(x) (15 - x)
  8. #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
  9. #define CHAR_ENDIAN(x) (x)
  10. #define HEX_ENDIAN(x) (x)
  11. #else
  12. #error "Unsupported Architecture"
  13. #endif
  14. bit get_bit(bit_array *bits, size_t index)
  15. {
  16. size_t segment = index / SIZE_IN_BITS(bit_array);
  17. size_t pos = index % SIZE_IN_BITS(bit_array);
  18. return BIT_CHECK(bits[segment], pos);
  19. }
  20. void set_bit(bit_array *bits, size_t index)
  21. {
  22. size_t segment = index / SIZE_IN_BITS(bit_array);
  23. size_t pos = index % SIZE_IN_BITS(bit_array);
  24. BIT_SET(bits[segment], pos);
  25. }
  26. void clear_bit(bit_array *bits, size_t index)
  27. {
  28. size_t segment = index / SIZE_IN_BITS(bit_array);
  29. size_t pos = index % SIZE_IN_BITS(bit_array);
  30. BIT_CLEAR(bits[segment], pos);
  31. }
  32. void hex2bits(bit_array *bits, size_t index, uint16_t hex)
  33. {
  34. for (short i = 0; i < 16; i++) {
  35. if (BIT_CHECK(hex, HEX_ENDIAN(i))) {
  36. set_bit(bits, i + index);
  37. }
  38. }
  39. }
  40. uint16_t bits2hex(bit_array *bits, size_t index)
  41. {
  42. uint16_t result = 0;
  43. for (short i = 0; i < 16; i++) {
  44. if (get_bit(bits, i + index)) {
  45. BIT_SET(result, HEX_ENDIAN(i));
  46. }
  47. }
  48. return result;
  49. }
  50. void char2bits(bit_array *bits, size_t index, char chr)
  51. {
  52. for (short i = 0; i < 8; i++) {
  53. if (BIT_CHECK(chr, CHAR_ENDIAN(i))) {
  54. set_bit(bits, i + index);
  55. }
  56. }
  57. }
  58. char bits2char(bit_array *bits, size_t index)
  59. {
  60. char result = 0;
  61. for (short i = 0; i < 8; i++) {
  62. if (get_bit(bits, i + index)) {
  63. BIT_SET(result, CHAR_ENDIAN(i));
  64. }
  65. }
  66. return result;
  67. }
  68. void bits_shift(bit_array *bits, int len, int offset)
  69. {
  70. offset %= len;
  71. if (offset < 0) {
  72. offset = len - (-offset);
  73. }
  74. for (int i = 0; i < offset; i++) {
  75. bool tmp = get_bit(bits, 0);
  76. for (int j = 1; j < len; j++) {
  77. get_bit(bits, j) ? set_bit(bits, 0) : clear_bit(bits, 0);
  78. tmp ? set_bit(bits, j) : clear_bit(bits, j);
  79. tmp = get_bit(bits, 0);
  80. }
  81. }
  82. }
  83. inline void bits_left_shift(bit_array *bits, int len, int offset)
  84. {
  85. bits_shift(bits, len, -offset);
  86. }