位运算操作相关

位操作

    在压缩和解压数据时,常常需要在小于一个字节的数量级上 进行数据操作。因此,在讨论各种数据压缩方法之前,首先必须熟悉一些对数据位进行的操作。这些操作非常重要,因为C语言本身只有一小步等内在的、不可分割的操作数。下面是介绍一些位操作的基础,和参阅博客:位操作基础篇之位操作全面总结

      下面是自己对博客内容简单的总结。

    
  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <memory.h>  
  4. #include <stdbool.h>  
  5.   
  6. /*位运算小技巧*/  
  7. /*1、判断奇偶*/  
  8.  
  9. #define IS_EVEN(n) {printf("number %d is:",(n));\  
  10.     (n) & 1 == 1?printf("奇数\n"):printf("偶数\n");}  
  11.   
  12. /*2、数据交换*/  
  13.  
  14. #define SWAP(a,b) { if (*a != *b){ \  
  15.                          *a ^= *b;\  
  16.                          *b ^= *a;\  
  17.                          *a ^= *b;\  
  18.                      }\  
  19.                   }  
  20.   
  21. /*3、交换符号,就是将整数变为负数,负数变为整数*/  
  22.  
  23. #define SIGN_REVERSAL(n) (~(a) + 1)  
  24.   
  25. /*4、求绝对值*/  
  26.  
  27. #define ABS(n) ((n) >> 31 == 0?(n):(~(n) + 1))  
  28.   
  29. /*5、0到100中刷选素数方法*/  
  30. #define  MAXN  100  
  31. bool flag[MAXN];  
  32. int primes[MAXN/3 + 1],pi = 0;  
  33.   
  34. void getPrime_1()  
  35. {  
  36.     int i,j;  
  37.     memset(flag,false,sizeof(flag));  
  38.     for(i = 2;i < MAXN; i++){  
  39.         if(!flag[i]){  
  40.             primes[pi++] = i;  
  41.             for(j = i; j < MAXN; j += i){  
  42.                 flag[j] = true;  
  43.             }  
  44.         }  
  45.     }      
  46. }  
  47. void PrintfArray()  
  48. {  
  49.     int i = 0;  
  50.     for(; i < pi; i++)  
  51.         printf("%d ",primes[i]);  
  52.     puts("");  
  53. }  
  54. /*位压缩筛选素数 
  55.  *其方法和上面的一样,只是在flag中用位来对应素数的位置 
  56.  * 
  57.  * */  
  58. int flag_2[MAXN/32];  
  59. void getPrime_2()  
  60. {  
  61.     int i,j;  
  62.     pi = 0;  
  63.     memset(flag_2,false,sizeof(flag_2));  
  64.     for(i = 2;i < MAXN; i++){  
  65.         if(!((flag_2[i/32] >> (i%32)) & 1)){  
  66.             primes[pi++] = i;  
  67.             for(j = i; j < MAXN; j += i){  
  68.                 flag_2[j/32] |= (1<<(j%32));  
  69.             }  
  70.         }  
  71.     }      
  72.   
  73. }  
  74.   
  75.   
  76. int main()  
  77. {  
  78.     IS_EVEN(20);  
  79.     int a = 10,b=20;  
  80.     printf("交换前:a = %d,b = %d\n",a,b);  
  81.     SWAP(&a,&b);  
  82.     printf("交换后:a = %d,b = %d\n",a,b);  
  83.     printf("a = %d,SIGN_REVERSAL(a) = %d\n",a,SIGN_REVERSAL(a));  
  84.     printf("ABS(a) = %d\n",ABS(a));  
  85.   
  86.     puts("用筛素数法求100以内的素数");  
  87.     getPrime_1();  
  88.     PrintfArray();  
  89.     puts("用位运算筛素数法求100以内的素数");  
  90.     getPrime_2();  
  91.     PrintfArray();  
  92.     return 0;  
  93. 下面是数据压缩和解压中经常 遇到的位操作函数介绍

    1. /*bit.c*/  
    2. #include <string.h>  
    3. #include <stdio.h>  
    4.   
    5. /**************************************************************** 
    6.  *获取bis中处于位置pos的位的状态。 
    7.  *返回值:相应位的状态:1or0。 
    8.  ***************************************************************/  
    9. int bit_get(const unsigned char * bits, int pos)  
    10. {  
    11.     unsigned char mask;  
    12.     int       i;  
    13.     /*设置掩码*/  
    14.     mask = 0x80;  
    15.   
    16.     for (i = 0; i < (pos % 8); i ++)  
    17.         mask = mask >> 1;  
    18.     /*获得当前位的数值*/  
    19.     return (((mask & bits[(int)(pos / 8)]) == mask )? 1:0);  
    20. }  
    21.   
    22. /********************************************************** 
    23.  *设置bits中处于pos的位的状态(根据state的数值来设置)。 
    24.  *最左边位置位0,状态值必须为0或1; 
    25.  *无返回值 
    26.  * ******************************************************/  
    27. void bit_set(unsigned char * bits, int pos, int state)  
    28. {  
    29.     unsigned mask;  
    30.     int i;  
    31.   
    32.     mask = 0x80;  
    33.   
    34.     for (i = 0; i < (pos % 8); i ++)  
    35.         mask = mask >> 1;  
    36.   
    37.     if (state)  
    38.         bits[pos/8] |= mask;  
    39.     else  
    40.         bits[pos/8] &= (~mask);  
    41.   
    42.     return;  
    43. }  
    44.   
    45. /******************************************************************** 
    46.  *对bist1与bist2进行异或运算,结果保存到bitsx, 
    47.  *无返回值  
    48.  * *****************************************************************/  
    49. void bit_xor(const unsigned char *bits1, const unsigned char *bits2, unsigned char *bitsx,int size)  
    50. {  
    51.     int i;  
    52.   
    53.     for (i = 0 ; i < size; i++){  
    54.         if(bit_get(bits1,1) != bit_get(bits2, 1)){  
    55.             bit_set(bitsx,i,1);  
    56.         } else {  
    57.             bit_set(bitsx,i,0);  
    58.         }  
    59.     }  
    60.     return;  
    61. }  
    62.   
    63. /**************************************************************** 
    64.  *将bits进行轮转,将位值向左移count位,操作完成后,处于最左端的 
    65.  *count位移动到最右端,而且其他位也相应的轮移 
    66.  * 无返回值 
    67.  * **************************************************************/  
    68. void bit_rot_left(unsigned char *bits,int size, int count)  
    69. {  
    70.     int fbit,  
    71.         lbit,  
    72.         i,  
    73.         j;  
    74.   
    75.     if (size > 0){  
    76.         for ( j = 0; j < count; j++){  
    77.             for(i=0;i<=((size - 1)/8);i++){  
    78.                 lbit = bit_get(&bits[i],0);  
    79.                 if (i == 0)  
    80.                     fbit = lbit;  
    81.                 else  
    82.                     bit_set(&bits[i - 1],7,lbit);  
    83.                 bits[i] = bits[i] << 1;  
    84.   
    85.             }  
    86.             bit_set(bits,size-1,fbit);  
    87.         }  
    88.     }  
    89. }  
    90.   
    91. int main()  
    92. {  
    93.     unsigned char a ='A' ;  
    94.     int i = 0;  
    95.     unsigned char b[]={'Z','B','C','D'};  
    96.   
    97.     printf("获得‘A’的值是:");  
    98.     /*打印出来应该是01000001 0x41*/  
    99.     for(i=0;i<8;i++){  
    100.         printf("%d",bit_get(&a,i));  
    101.     }  
    102.   
    103.   
    104.     bit_set(&a,4,1);  
    105.     /*设置完的数值应该为01001001 0x49 'I'*/  
    106.     printf("\n ###%s() ,%d = %c\n",__FUNCTION__,a,a);  
    107.   
    108.     bit_rot_left(b,9,2);  
    109.   
    110.     printf("%s\n",b);  
    111.   
    112. }  

    其中对函数bit_rot_left()具体的功能有点模糊,测试几遍还是未能理解!有知道的麻烦给具体解答下! 
  94. 【本文转至】:http://blog.csdn.net/sjin_1314/article/details/8743888
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值