C语言---内存剖析

 

按位与 &

  1101110                 101101

  0110101                000100

———————     ---------------

  0100100                000100

原位和1&,保持不变;和0&,都为0

因此,可以让原来数字的某位与1&,根据结果能确定该位是0还是1,且结果只有0或1

a&1==1   //a为奇数,因为奇数的最后一位是1

a&1==0   //a为偶数,因为偶数的最后一位是0

 

//输出一个整数的二进制形式

void printBinary(int num){

    // 采用右移后,每一位&1取得每一位的值打印

    // 定义变量,记录右移的位数

         // 右移31&1位取得第一位值    0或1

    // (sizeof(num)<<3)-1==4*8-1==31

    for ( int count=(sizeof(num)<<3)-1; count>=0; count--) {

        printf("%d",(num>>count)&1);  // 任何数&1结果只能为0或者1

        if (!(count%4)) {

            printf(" ");

            if (!(count%8)) {

                printf(" ");

            }

        }

    }

    printf("\n");

}

 

 

 

按位或 |

  010110                 101101

  011100                 000000

———————     ---------------

  011110                 101101

a|0=a

 

按位异或 ^

  每位相同得0,不同得1。 且可以交换

a^b^c==a^c^b==b^a^c

a^a==0

a^0==a

a^b^a==b

// 利用位异或^运算实现a、b值的互换a^b^a==a^a^b==0^b==b

     a=a^b;    

     b=a^b;   

     a=a^b;    

 

左移 <<

a<<n==a*2的n次方

但是左移有可能导致正负性改变

 

右移 >>

a>>n==a/2的n次方

正负性不变

posted on 2015-04-08 09:56  我是一匹小黑马  阅读(94)  评论(0编辑  收藏  举报