C 移位運算子詳細說明

2021-08-29 20:49:40 字數 2162 閱讀 1776

為什麼需要移位?移位可以提高**的執行效率,增快執行的速度。

向左移n位 等價於 *2^n

向右移n位等價於 / 2^n

以前感覺移位運算子自己挺明白的,也許是學的時間長了,後來一看,忘得差不多了。現在參考一些網上的學習資料,將位移運算子整理一下,作為知識點總結,也算個積累。在講移位運算子之前,先簡單補充一下原碼與補碼的知識。

在計算機系統中,數值一律用補碼來儲存(表示)。主要原因:使用補碼,可以將符號位和其他位統一處理;同時減法也可按加法來處理。另外,兩個補碼表示的數相加時,如果最高位(符號位)有進製,則進製被捨棄。

例如:+9的原碼是0000 1001。補碼也是0000 1001。

例如:-7原碼為1000 0111(高位為符號位,1表示負數,0表示正數),補碼為1111 1001.

例如:+9的補碼是0000 1001。原碼也是0000 1001。

例如:-7的補碼是1111 1001,原碼是1000 0111。

「<<」和「>>」運算子用於執行移位運算,分別稱為左移位運算子和右移位運算子。對於x<>n形式的運算,含義是將x向左或向右移動n位,得到的結果的型別與x相同。此處,x的型別只能是int,uint、long或ulong,n的型別只能是int,n的型別只能是int,或者顯示轉換為這些型別之一,否則變異程式時會出現錯誤。

使用左移位(<<)運算子可以將數向左移位。其作用是所有的位都向左移動指定的次數,高次位就會丟失,低位以0來填充。

注意:如果第乙個運算元是int或uint(32位數),則移位數有第二個運算元的低5位給出(原因是:低5位可表示的數的範圍是024+23+22+21+20,即031,足夠乙個 32位數移位使用),如果第乙個運算元是long或ulong(64位數),則移位數由第二個運算元的低6位給出(原因同上)。在左移時,第乙個運算元的高序位被放棄,低序空位 用0填充。移位操作從不導致溢位。

(1)正數左移位(以85為例,可以視作int 、long、uint、ulong之一,此處視為uint型別,32位)

85的二進位制表示:      0000 0000 0000 0000 0000 0000 0101 0101
85左移(<<)3位: 0000 0000 0000 0000 0000 0010 1010 1000

移位後的結果十進位制表示: 680

(2)負數左移位(以-85為例,可以視作int 、long之一,此處視為int,32位)

-85的二進位制補碼表示:      1111 1111 1111 1111 1111 1111 1010 1011

-85左移(<<)3位:       1111 1111 1111 1111 1111 1101 0101 1000

移位後結果的原碼表示:      1000 0000 0000 0000 0000 0010 1010 1000

移位後的結果十進位制表示:     -680

右移位運算子(>>)是把數向右移位,其作用是所有的位都向右移動指定的次數。

注意:如果第乙個運算元是int或uint(32位數),則移位數有第二個運算元的低5位給出(原因是:低5位可表示的數的範圍是024+23+22+21+20,即031,足夠乙個 32位數移位使用),如果第乙個運算元是long或ulong(64位數),則移位數由第二個運算元的低6位給出(原因同上)。如果第乙個運算元為int或long,則右移位是算數移 位(高序空位設定為符號位)。如果第乙個運算元是uint或ulong型別,則右移位是邏輯移位(高位填充0)。

(1)正數右移位(以85為例,可以視作int 、long、uint、ulong之一,按哪個規則都行)

85的二進位制表示:      0000 0000 0000 0000 0000 0000 0101 0101

85右移(>>)3位: 0000 0000 0000 0000 0000 0000 0000 1010

移位後的結果十進位制表示: 10

(2)負數右移位(以-85為例,可以視作int 、long之一,此處視為int,32位)

-85的二進位制補碼表示:      1111 1111 1111 1111 1111 1111 1010 1011

-85左移(>>)3位:       1111 1111 1111 1111 1111 1111 1111 0101

移位後結果的原碼表示:      1000 0000 0000 0000 0000 0010 0000 1011

移位後的結果十進位制表示:     -11

位運算子解析 理解(詳細說明)

異或 兩邊的位不同時結果為1,否則為0 簡訴 這個可以理解f a b 如果不同結果為1,否則為0 例子 比如 2 3 10 11 第二位都是1所以第二位的0,第二位不同所以為1 最終結果01 1 非 0變1 1變0 簡訴 取反。可連線if a 1 變 0 0 變1 例子 比如 2 000000000...

C 移位運算子

int result1 66 1 正數的左移位運算規則,左移一位乘以2,右移移位除以2 左移兩位乘以4,三位乘以8,4位乘以16,右移則相反 int result2 66 1 負數的移位運算在最高位補1 運算規則和正數一樣 console.writeline 正數移位 result1 負數移位 re...

移位運算子

移位運算子不外乎就這三種 左移 帶符號右移 和 無符號右移 1 左移運算子 左移運算子 使指定值的所有位都左移規定的次數。1 它的通用格式如下所示 value num num 指定要移位值value 移動的位數。左移的規則只記住一點 丟棄最高位,0補最低位 如果移動的位數超過了該型別的最大位數,那麼...