A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© chunhuayun 中级黑马   /  2015-9-24 08:31  /  485 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

位运算符

一、介绍
        位运算是指按二进制进行的运算。C语言提供了六种位操作运算符,这些运算符只能针对整型的数据。也就是带符号和无符号的,如char,short,long, int等

二、位运算符
用于二进制之间的运算

1. & 按位与
        例如:9 & 4
        即   0000 1001
          &  0000 0100
          --------------
                   0000 0000
         printf("%d",9&4);//打印结果:0       

2. | 按位或
        例如:9 | 4
        即   0000 1001
          |  0000 0100
          --------------
                   0000 1101
         printf("%d",9|4);//打印结果:11       

3. ~ 按位取反
        例如:~4
        即   
          ~  0000 0100
          --------------
                   1111 1011补 ---> 1111 1010反--> 1000 0101原 = [-5]
         printf("%d",~4);//打印结果:-5       

4. >> 右移位
        规则:各二进制位全部右移n位,低位丢弃,高位要补符号位。相当于 原数/2^n.不会改变一个数的正负性
        如 8 >> 2 = 2

5. << 左移位
        规则:各二进制位全部左移n位,高位丢弃,低位补0。相当于 原数*2^n
        例如:2<<3
        0000 0010 左移 成为0 0010 ,此时高位被丢弃,低位补0,结果为:0 0010 000 = (0001 0000)2 = (16)10

        致命问题:左移可能会改变一个数的正负性


6. ^ 按位异或
        计算规则:相同为0,不同为1

        例如:9 ^ 4
        即   0000 1001
           ^ 0000 0100
          --------------
             0000 1101 --- > 13
        printf("%d",9^4);//打印结果:13

二、用法
1.& a.任何数与1的与运算都取该数的最低位。可演变为取某个数的特定位
        如 9 & 1 = 1
        b.把某数的第n位置为0
        如 把9的第3位置为0, 9 & 7 ---->1001 & 0111 = (0001)2 = (1)10

2.使用举例
        2.1 把十进制数按照二进制打印
         
  1.   int num = 8;
  2.             int len = sizeof(num) * 8;//取得数字的二进制长度
  3.             int result[len];
  4.             
  5.             for (int i = 0; i < len; i++) {
  6.                 result[len - 1 - i ] = num & 1;//每次取最低位
  7.                 num =  num >> 1;//右移一位
  8.             }
  9.             
  10.             for (int j = 0; j < len; j++) {
  11.                 printf("%d", result[j]);
  12.             }
复制代码


        2.2 判断一个数的奇偶性
  1.                     int num = 10;
  2.                     int n = num & 1;//取最低位
  3.                     
  4.                     if(n){
  5.                         printf("奇数");
  6.                     }else{
  7.                         printf("偶数");
  8.                     }
复制代码




        2.3 不使用其他中间值--交换两个变量的值
方案一
  1.   int a = 3, b = 5;
  2.             a = a + b;
  3.             b = a - b;
  4.             a = a - b;
  5.             printf("a = %d, b = %d\n",a, b);
复制代码



            打印结果:a = 5, b = 3
隐患:如果两个数很大,那么就会溢出

方案二
  1.             int a = 4, b = 5;
  2.             a = a ^ b;
  3.             b = a ^ b;
  4.             a = a ^ b;
  5.             printf("a = %d, b = %d\n",a, b);
复制代码

                打印结果:a = 5, b = 4


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马