C中的位运算
2015年12月21日 23:04:38 C/C++ ⁄ 共 4337字 评论数 1 ⁄ 被围观 3,346次

位运算是指进行二进制位的运算,这里主要贴一些例子代码,仅供参考。

一、“按位与”运算符(&)的应用。

Code   ViewPrint
  1. /*
  2.  * 按位与:
  3.  * 参加 & 运算的若为正数,则直接按照正数的补码运算。 
  4.  * 参加 & 运算的若为负数,则会把负数表示为补码形式,然后参加运算。
  5.  * 特殊用途:清零;取一个数中某些指定位;保留指定位。 
  6.  */
  7. void bitAnd() {
  8.     printf("=== Bit And Operator Begin... ===\n");
  9.     // 3    00000011
  10.     // 5    00000101
  11.     // 3&5  00000001 = 1
  12.     printf("\t3 & 5 = %d\n", 3&5);
  13.     // -3   11111101
  14.     // -5   11111011
  15.     // -3&-5    11111001 = -7 
  16.     printf("\t-3 & -5 = %d\n", -3&-5);
  17.     printf("=== Bit And Operator End. ===\n\n");
  18. }

二、“按位或”运算符(|)的应用。

Code   ViewPrint
  1. /*
  2.  * 按位或: 
  3.  * 特殊用途:对某一个数据的指定位定值为 1。
  4.  * 例如:a | 0377 或者 a | B,则值a的高八位保留原样,低八位则置为 1。 
  5.  */
  6. void bitOr() {
  7.     printf("=== Bit Or Operator Begin... ===\n");
  8.     // a    10100011
  9.     printf("\t3 | 5 = %d\n", 3|5);
  10.     printf("=== Bit Or Operator End. ===\n\n");
  11. }

三、“按位异或”运算符(^)的应用。

Code   ViewPrint
  1. /*
  2.  * 按位异或:
  3.  * 特殊用途:与1相^,反转原值;与0相^,保留原值;交换两个值,不用临时变量。 
  4.  */
  5. void bitXor() {
  6.     printf("=== Bit XOR Operator Begin... ===\n");
  7.     int a = 3;
  8.     int b = 5;
  9.     printf("\tBefore XOR Operator: a = %d, b = %d.\n", a, b);
  10.     a = a ^ b;
  11.     b = b ^ a;
  12.     a = a ^ b;
  13.     printf("\tAfter XOR Operator: a = %d, b = %d.\n", a, b);
  14.     printf("=== Bit XOR Operator End. ===\n\n");
  15. }

四、“取反”运算符(~)的应用。

特别注意:~的优先级比算术运算符,关系运算符,逻辑运算符和其它运算符都高。

五、“左移”运算符(<<)的应用。

Code   ViewPrint
  1. /*
  2.  * 左移:
  3.  * 特别注意:<<高位左移后移除,舍弃;左移一位相当于原数乘以2;左移比乘法运算快的多。 
  4.  */
  5. void bitLeftShift() {
  6.     printf("=== Bit Left Shift Operator Begin... ===\n");
  7.     int a = 15;
  8.     printf("\tBefore Left Shift Operator: a = %d\n", a);
  9.     a = a << 2;
  10.     printf("\tAfter Left Shift Operator: a = %d\n", a);
  11.     printf("=== Bit Left Shift Operator Begin... ===\n\n");
  12. }

六、“右移”运算符(>>)的应用。

Code   ViewPrint
  1. /*
  2.  * 右移:
  3.  * 特别注意:>>低位右移后移除,舍弃,高位补0还是1,看情况;右移一位相当于原数除以2。 
  4.  * 右移时,需要特别注意符号问题。对无符号数,右移时左侧高位移入0;对于有符号数,
  5.  * 如果原来符号位为0(该数为正),则左侧移入0。如果符号位为1(该数为负),则左侧
  6.  * 移入 0 还是 1,要取决于所用的计算机系统。有的系统移入 0,称为“逻辑右移”;
  7.  * 有的系统移入 1,称为“算术右移”。C编译器常用的是算术右移。 
  8.  */
  9. void bitRightShift() {
  10.     printf("=== Bit Right Shift Operator Begin... ===\n");
  11.     int a = 40;
  12.     printf("\tBefore Right Shift Operator: a = %d\n", a);
  13.     a = a >> 2;
  14.     printf("\tAfter Right Shift Operator: a = %d\n", a);
  15.     printf("=== Bit Right Shift Operator Begin... ===\n\n");
  16. }

下面是一些 Demo:

Code   ViewPrint
  1. /* 取一个整数 a 从右端开始的 4-7 位 */
  2. /* 分析:取从右端开始的 4-7 位,从第 0 位开始计数,所以数 a 的最右端 4 位不取,
  3.  * 从第 4 位开始取位,4-7 一共要取 4 个位,一直取到第 8 位,。 
  4.  */
  5. void Demo_01() {
  6.     printf("========== Test Demo_01 ===========\n");
  7.     // 方法一:先把 a 右移 4 位;设置一个低 4 位为 1,其它位全为 0 的数;再做 &。
  8.     unsigned a, b, c, d;
  9.     scanf("%o", &a);
  10.     b = a >> 4;
  11.     c = ~(~0 << 4);
  12.     d = b & c;
  13.     printf("%o, %d\n%o, %d\n", a, a, d, d);
  14.     // 方法二:直接设置一个数,取出 4-7 位,如:11110000,即0360,用;然后右移四位。 
  15.     unsigned e;
  16.     scanf("%o", &a);
  17.     printf("Input 360,即11110000 ==> ");
  18.     scanf("%o", &e);
  19.     printf("%o, %d\n%o, %d\n", a, a, (a & e) >> 4, (a & e) >> 4);
  20. }
Code   ViewPrint
  1. // 循环移位。将数 a 进行右循环移位,移动 n 位,右侧的 n 位移动到左侧。
  2. /* 方法:将数 a 的右侧 n 位放入另外一个变量;把 a 右移 n 位; 再做 |。  
  3.  */
  4. void Demo_02() {
  5.     printf("========== Test Demo_02 ===========\n");
  6.     unsigned a, b, c, d;
  7.     int n;
  8.     scanf("a=%o,n=%d", &a, &n);
  9.     b = a << (16-n);
  10.     c = a >> n;
  11.     d = b | c;
  12.     printf("%o, %d\n%o, %d\n", a, a, d, d);
  13. }
Code   ViewPrint
  1. // 变量 data,假设 a,b,c,d 分别占data的 2位、6位、4位、4位,将 c 的值变为 12。
  2. void Demo_03() {
  3.     printf("========== Test Demo_03 ===========\n");
  4.     unsigned data, result, temp;
  5.     scanf("data=%x", &data);
  6. //  result = data & 0xff0f;//方法一 
  7.     result = data & (~(15 << 4));//方法二
  8.     temp = 12;
  9.     temp = (temp & 15) << 4;
  10.     result = result | temp;
  11.     printf("%x, %d\n", result, result);
  12. }
Code   ViewPrint
  1. /* Define Function
  2.  * By 郎图腾   
  3.  */
  4. /* 取出一个16位数的奇数位函数。*/
  5. unsigned getOddbits(int a) {
  6.     return (0xaaaa & a);
  7. }
  8. /* 求得原码的补码函数getComplement(a) */
  9. void getComplement(int a) {
  10.     printf("== 求得原码的补码函 ==\n");
  11.     printf("Input a(10) = %d, a(16) = %x\n", a, a);
  12.     printf("The Complement is %x\n", ~a+1);
  13. }
  14. /* 循环移位函数move(a, n) */
  15. void move(int a, int n) {
  16.     printf("== 循环移位函数move(a, n) ==\n");
  17.     if (0 == a) {
  18.         printf("0再移位,还是个0,还是算了,别移了!\n");
  19.     } else {
  20.         printf("n = %d\n", n);
  21.         printf("== n > 0 时右移位,n < 0时左移位。==\n");
  22.         unsigned b, c, d;
  23.         if (n > 0) {
  24.             b = a << (32-n);
  25.             c = a >> n;
  26.             d = b | c;
  27.             printf("数 %d 右移 %d 位后的值为:%d\n", a, n, d);
  28.         } else {
  29.             n = -n;
  30.             b = a >> (32-n);
  31.             c = a << n;
  32.             d = b | c;
  33.             printf("数 %d 左移 %d 位后的值为:%d\n", a, n, d);
  34.         }
  35.     }
  36. }

目前有 1 条留言 其中:访客:0 条, 博主:0 条

  1. Avatar photo 康希玲 : 2015年12月22日16:26:58  -9楼 @回复 回复

给我留言

留言无头像?