Advertisement
ibanezzaro

bit array

Mar 16th, 2016
287
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.81 KB | None | 0 0
  1.  
  2. #include <stdio.h>
  3. #define SIZE 6
  4.  
  5. void set_clear(int*);
  6. void toggle_on(int*, int);
  7. //void toggle_off(int*, int);
  8. void differentiate (int*, int*);
  9. int *intersect(int*, int*);
  10. int *unify(int*, int*);
  11. int compare_test(int*, int*, int);
  12. int visit_bit(int*, int);
  13. void print_array(int*);
  14.  
  15. int main()
  16. {
  17.     //int difference[SIZE], intersection[SIZE], unity[SIZE];
  18.     int X1[SIZE] = {0, 12, 56, 32, 34, 32};
  19.     int X2[SIZE] = {5, 18, 55, 21, 30, 32};
  20.     //voglio assicurarmi che siano tutti e 3 puliti
  21.     //set_clear(difference);
  22.     //set_clear(intersection);
  23.     //set_clear(unity);
  24.  
  25.     differentiate(X1, X2);
  26.     //intersection[SIZE] = intersect(X1, X2);
  27.     //unity[SIZE] = unify(X1, X2);
  28.  
  29.     print_array(X1);
  30.     print_array(X2);
  31.     //print_array(difference);
  32.     //print_array(intersection);
  33.     //print_array(unity);
  34. }
  35.  
  36.  
  37. void set_clear(int bitArray[SIZE])
  38. {
  39.     int i;
  40.  
  41.     for(i = 0; i < SIZE * 32; i++)
  42.     {
  43.         bitArray[i] = 0;
  44.     }
  45. }
  46.  
  47. void toggle_on(int bitArray[SIZE], int k)
  48. {
  49.     int i = k/32;
  50.     int pos = k%32;
  51.     unsigned int flag = 1;
  52.  
  53.     flag = flag << pos;
  54.     bitArray[i] = bitArray[i] | flag;
  55.  
  56.     //una versione più breve sarebbe stata A[k/32] |= 1 << (k%32);
  57. }
  58.  
  59. /*void toggle_off(int bitArray[SIZE], int k)
  60. {
  61.     int i = k/32;
  62.     int pos = k%32;
  63.     unsigned int flag = 1;
  64.  
  65.     flag = flag << pos;
  66.     flag = ~flag;
  67.     bitArray[i] = bitArray[i] & flag;
  68.  
  69.     //allo stesso modo la versione breve ha & invece di | e not (~)
  70. }*/
  71.  
  72. //non è il modo più elegante di fare un test
  73. int compare_test(int X1[SIZE], int X2[SIZE], int k)
  74. {
  75.     int i = k/32;
  76.     int pos = k%32;
  77.     unsigned int flag = 1;
  78.  
  79.     flag = flag << pos;
  80.  
  81.     if((X1[i] & flag) == 1)
  82.     {
  83.         if((X2[i] & flag) == 1)
  84.         {
  85.             return 1;
  86.         }
  87.         else
  88.         {
  89.             return 0;
  90.         }
  91.     }
  92.     else
  93.     {
  94.         if((X2[i] & flag) == 1)
  95.         {
  96.             return 2;
  97.         }
  98.         else return -1;
  99.     }
  100. }
  101.  
  102. void differentiate(int X1[SIZE], int X2[SIZE])
  103. {
  104.  
  105.     print_array(X1);
  106.  
  107.     int k = 0;
  108.     int i = k/32;
  109.     int pos = k%32;
  110.     unsigned int flag = 1;
  111.  
  112.     flag = flag << pos;
  113.  
  114.     while(k < 32 * SIZE)
  115.     {
  116.         if((X1[i] & flag) && (X2[i] & flag) == 0)
  117.         {
  118.             printf("1, ");
  119.             k++;
  120.         }
  121.         else
  122.         {
  123.             printf("0, ");
  124.             k++;
  125.         }
  126.     }
  127.     printf("\n\n");
  128. }
  129.  
  130. /*void differentiate(int X1[SIZE], int X2[SIZE])
  131. {
  132.  
  133.     int counter = 0;
  134.     while(counter < 32 * SIZE)
  135.     {
  136.         int c = compare_test(X1, X2, counter);
  137.         printf("%d", c);
  138.         if(c == 0)
  139.         {
  140.             printf("1, ");
  141.             counter++;
  142.         }
  143.         else
  144.         {
  145.             printf("0, ");
  146.             counter++;
  147.         }
  148.     }
  149.     printf("\n\n");
  150. }*/
  151.  
  152. int *intersect(int X1[SIZE], int X2[SIZE])
  153. {
  154.     int X3[SIZE];
  155.     int counter = 0;
  156.     while(counter < 32 * SIZE)
  157.     {
  158.         int c = compare_test(X1, X2, counter);
  159.         if(c == 1 || c )
  160.         {
  161.             toggle_on(X3, counter);
  162.             counter++;
  163.         }
  164.         else
  165.         {
  166.             counter++;
  167.         }
  168.     }
  169.     return X3;
  170. }
  171.  
  172. int *unify(int X1[SIZE], int X2[SIZE])
  173. {
  174.     int X3[SIZE];
  175.     int counter = 0;
  176.     while(counter < 32 * SIZE)
  177.     {
  178.         int c = compare_test(X1, X2, counter);
  179.         if(c > 0)
  180.         {
  181.             toggle_on(X3, counter);
  182.             counter++;
  183.         }
  184.         else
  185.         {
  186.             counter++;
  187.         }
  188.     }
  189.     return X3;
  190. }
  191.  
  192. int visit_bit(int bitArray[SIZE], int k)
  193. {
  194.     return 1 & (bitArray[k/32] >> (k%32));
  195. }
  196.  
  197. void print_array(int *bitArray)
  198. {
  199.     for(int i = 0; i < SIZE * 32; i++)
  200.     {
  201.         printf("%d ", visit_bit(bitArray, i));
  202.     }
  203.     printf("\n");
  204. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement