C [3] 運算符 - 位運算、取反、左右移


C [3] 運算符 - 位運算、取反、左右移

示例:

#include <stdio.h>

int main()
{
    //滔Roy 2021.11.01

     //位運算 & | ^
    unsigned int a = 1;
    unsigned int b = 0;
    int c = 0;
    c = a & b;  //按位與運算    0&0=0; 0&1=0; 1&0=0; 1&1=1;   兩位同時為“1”,結果才為“1”,否則為0
    printf("a&b 的值是 %d \n",c );   //0
    c = a | b;  //按位或運算     0|0=0; 0|1=1; 1|0=1; 1|1=1;  只要有一個為1,其值為1。
    printf("a|b 的值是 %d\n",c );   //1
    c = a ^ b;  //按位異或運算   0^0=0; 0^1=1; 1^0=1;  1^1=0;  (異值)不同為1,相同為0
    printf("a^b 的值是 %d\n",c );   //1


    //取反 `
    //int	2 或 4 字節    范圍	-32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
    //計算機中的有符號數有三種表示方法,即原碼、反碼和補碼。符號位 用0表示“正”,用1表示“負”。在計算機系統中,數值一律用補碼來表示和存儲。 因為 使用補碼,可以將符號位和數值域統一處理(包括加法和減法)
    //反碼通常是用來由原碼求補碼或者由補碼求原碼的過渡碼。正數的反碼與其原碼相同;負數的反碼是對正數逐位取反,符號位保持為1.  例如:原10010=反11101  ,原11101 = 反10010 即(-2十進制)
    a =~a;
    printf("~a 的值是 %d\n",a );    //-2
    c = ~a;     //取反    即0為1 , 1為0   假設1個字節即8bit位,則1的二進制值為(原碼):0000 0001  取反(補碼):1111 1110  將取反的值轉換成原碼(1000 0010 十進制 -2):
    printf("~a 的值是 %d\n",c );   //1


    c = ~b;     //取反    即0為1 , 1為0   假設1個字節即8bit位,則0的二進制值為(原碼):0000 0000  取反(補碼):1111 1111  將取反的值轉換成原碼(1000 0001 十進制 -1):
    printf("~b 的值是 %d\n",c );    //-1
    c = ~2;     //取反            2的二進制為 010  取反 101
    printf("~2 的值是 %d\n",c );    //-3
    c = ~3;     //取反
    printf("~3 的值是 %d\n",c );   //-4
    c = ~4;     //取反
    printf("~4 的值是 %d\n",c );   //-5
    c = ~5;     //取反
    printf("~5 的值是 %d\n",c );   //-6

    /*
        疑問1:1取反的值為什么是 -2 ?
        1、假設:10的8位二進制
        原碼:0000 1010
        反碼:0000 1010   //正數的反碼與原碼相同
        補碼:0000 1011   //反碼+1

        2、假設:-10的8位二進制
        原碼:1000 1010
        反碼:1111 0101   //負數的反碼是對正數逐位取反,符號位保持為1
        補碼:1111 0110   //反碼+1

        3、假設:1的8位二進制
        原碼:0000 0001
        取反:1111 1110   //取反后的值,實際是“補碼”值

        補碼還原反碼:1111 1101   //將補碼的值 還原成原碼:1、先還原成反碼,即先減1 ,
        反碼還原原碼:1000 0010   //2、反碼再還原成原碼(負數的反碼是對正數逐位取反,符號位保持為1)
        原碼轉換成10進制:-2

        4、假設:0的8位二進制
        原碼:0000 0000
        取反:1111 1111
        補碼還原反碼:1111 1110  //將補碼的值 還原成原碼:1、先還原成反碼,即先減1 ,
        反碼還原原碼:1000 0001(-1 十進制)

        5、假設:2的8位二進制
        原碼:0000 0010
        取反:1111 1101

        補碼還原反碼:1111 1100  //減1
        反碼還原原碼:1000 0011 (-3 十進制)

        疑問2:為什么要用到取反? 取反有什么作用?
        目前個人的理解,取反的作用,大部分用在 開關上,即開(1),關(0),僅此而已,無需深入研究。

    */


    //左移 <<   左移若干位,右不足補0
    c = 1 << 2;    //1左移2位
    printf("c 的值是 %d\n",c );   //4    1的8位二進制原碼:0000 0001  左移2位:0000 0100(4 十進制)
    c = 10 << 2;    //10左移2位
    printf("c 的值是 %d\n",c );   //40    10的8位二進制原碼:0000 1010  左移2位:0010 1000(40 十進制)

    //右移 >>   右移若干位,左不足補0
    c = 1 >> 2;    //1右移2位
    printf("c 的值是 %d\n",c );   //0   1的8位二進制原碼:0000 0001  右移2位:0000 0000(0 十進制)
    c = 10 >> 2;    //10右移2位
    printf("c 的值是 %d\n",c );   //2   10的8位二進制原碼:0000 1010  右移2位:0000 0010(2 十進制)

}

  

 

 

 

創建時間:2021.11.01  更新時間:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM