C语言 位运算

来源:互联网 发布:ug编程自学能学会吗 编辑:程序博客网 时间:2024/06/05 11:01

正整数:原码反码补码是相同的

   正整数:第一个位符号位,正数符号为0

 

   1 =    0000 0000 0000 0000 0000 0000 0000 0001

   对于负数

   -1原码  1000 0000 0000 0000 0000 0000 0000 0001

   反码:原码符号位不变,其他位取反(0110)

   -1     1111 1111 1111 1111 1111 1111 1111 1110

   补码:反码 + 1

   -1     1111 1111 1111 1111 1111 1111 1111 1111


   在计算机中存储的就是数字补码

 

 

 

    0000 0000 0000 0000 0000 0000 0000 0001

+   1111 1111 1111 1111 1111 1111 1111 1111

 --------------------------------------------

    0000 0000 0000 0000 0000 0000 0000 0000

 

 

 正数:13  0000 0000 0000 0000 0000 0000 0000 1101

 

 负数 -13补码就是正数取反+1

         1111 1111 1111 1111 1111 1111 1111 0011






***********************

位运算:针对二进制位运算

 

  & 按位与:对应的二进制位上,一个为0就是0,全1才为1

          一假则假

 

  | 按位或对应的二进制位上,一个为1就是1,全0才为0

          一真则真

 

  ^ 按位异或对应的二进制位上,不同为1,相同为0

            1、多个数相互异或交换顺序结果不变(类似加法交换律)

            2、任何数异或上0都是原来的数

            3、相同的数相互异或结果为0

  ~ 按位取反:对应的二进制位上,0110

 

  >> 右移  m >> n :  m向右移动n:移出来的位直接删掉,移入位补符号位(正数补0,负数补1)

           使用场景:快速计算一个数除以2n次方,对于一个整数来说右移几位就是除以2几次方

 

  << 左移  m << n : m向左移动n位,移出来的位直接删掉,移入位补0

          左移可能会改变符号位

          使用场景:当数比较小时候,可以快速的计算这个数乘以2多少次方

  快速计算23次方


*****************************

/*

  1、交换两个变量的值,不借助中变量

 

  2、判断一个数的奇偶性

 */


void test()

{

    int a = 30;

    int b = 20;

    

    /* 借助中间变量 */

    //    int temp = a;

    //    a = b;

    //    b = temp;

    //  第一种方式:算术运算

    

    //      a = a - b;

    //      b = a + b;// b = a - b +b =a

    //      a = b - a;// a = a - (a -b  =a - a + b =b

    

    //  第二种方式:异或运算

    

    a = a ^ b;

    b = a ^ b; // a ^b ^b =a ^ 0 = a

    a = a ^ b; // a ^b ^a =a  ^ a ^b = 0  ^b = b

    

    printf("%d,%d\n",a,b);

}



// 2、判断一个数的奇偶性

int main(int argc,const char * argv[]) {

    int n = 10;

//  第一种方式

    if (n % 2 ==0) {

        printf("偶数\n");

    }else{

        printf("奇数\n");

    }

    

//  第二种方式:(不推荐使用)

    int rs =  n % 2 == 0 ? printf("偶数\n") : printf("奇数\n");

    printf("%d\n",rs);

    

//  第三种方式:&

  /*

    101

  & 001

   ----

      1

  */

    

    if (n & 1) {

        printf("奇数\n");

    }else{

        printf("偶数\n");

    }

    

    

    return 0;

}



0 0
原创粉丝点击