c#是用<>(右移) 運算子是用來執行移位運算。
左移 (<
將第乙個運算元向左移動第二個運算元指定的位數,空出的位置補0。
左移相當於乘. 左移一位相當於乘2;左移兩位相當於乘4;左移三位相當於乘8。
x<<1= x*2
x<<2= x*4
x<<3= x*8
x<<4= x*16
同理, 右移即相反:
右移 (>>)
將第乙個運算元向右移動第二個運算元所指定的位數,空出的位置補0。
右移相當於整除. 右移一位相當於除以2;右移兩位相當於除以4;右移三位相當於除以8。
x>>1= x/2
x>>2= x/4
x>>3= x/8
x>>4=x/16
當宣告過載c#移位運算子時,第乙個運算元的型別必須總是包含運算子宣告的類或結構,並且第二個運算元的型別必須總是 int,如:
class program以上表示式,輸出結果是:<< 2 結果是:", shift1.vala, shift2.vala);
console.writeline(" << 2 結果是:", shift1.valb,shift2.valb);
console.writeline(" >> 2 結果是:", shift1.vala, shift3.vala);
console.writeline(" >> 2 結果是:", shift1.valb, shift3.valb);
console.readline();
}public class shiftclass
public static shiftclass operator <
public static shiftclass operator >>(shiftclass shift, int count)
}}
因為位移比乘除速度快.對效率要求高,而且滿足2的冪次方的乘除運方,可以採用位移的方式進行。
**一.原碼與補碼
在計算機系統中,數值一律用補碼來儲存(表示)。主要原因:使用補碼,可以將符號位和其他位統一處理;同時減法也可按加法來處理。另外,兩個補碼表示的數相加時,如果最高位(符號位)有進製,則進製被捨棄。
1.原碼轉補碼分兩種情況
(1)正數的補碼:與原碼相同(已知原碼求補碼)
例如:+9的原碼是0000 1001。補碼也是0000 1001。
(2)負數的補碼:符號位為1,其餘位為該數絕對值的原碼按位取反,然後整個數加1。
例如:-7原碼為1000 0111(高位為符號位,1表示負數,0表示正數),補碼為1111 1001.
2.補碼轉原碼也分兩種情況(已知補碼求原碼)
(1)正數的原碼:與補碼相同
例如:+9的補碼是0000 1001。原碼也是0000 1001。
(2)負數的原碼:符號位為1,其餘位為該該補碼按位取反,然後整個數加1。
例如:-7的補碼是1111 1001,原碼是1000 0111。
二.移位運算子
「<>」運算子用於執行移位運算,分別稱為左移位運算子和右移位運算子。對於x<>n形式的運算,含義是將x向左或向右移動n位,得到的結果的型別與x相同。此處,x的型別只能是int,uint、long或ulong,n的型別只能是int,n的型別只能是int,或者顯示轉換為這些型別之一,否則變異程式時會出現錯誤。
1.左移位運算子
使用左移位(<
注意:如果第乙個運算元是int或uint(32位數),則移位數有第二個運算元的低5位給出(原因是:低5位可表示的數的範圍是0~24+23+22+21+20,即0~31,足夠乙個 32位數移位使用),如果第乙個運算元是long或ulong(64位數),則移位數由第二個運算元的低6位給出(原因同上)。在左移時,第乙個運算元的高序位被放棄,低序空位 用0填充。移位操作從不導致溢位。
(1)正數左移位(以85為例,可以視作int 、long、uint、ulong之一,此處視為uint型別,32位)
85的二進位制表示: 0000 0000 0000 0000 0000 0000 0101 0101
85左移(<
移位後的結果十進位制表示: 680
(2)負數左移位(以-85為例,可以視作int 、long之一,此處視為int,32位)
-85的二進位制補碼表示: 1111 1111 1111 1111 1111 1111 1010 1011
-85左移(<
移位後結果的原碼表示: 1000 0000 0000 0000 0000 0010 1010 1000
移位後的結果十進位制表示: -680
2.右移位運算子
右移位運算子(>>)是把數向右移位,其作用是所有的位都向右移動指定的次數。
注意:如果第乙個運算元是int或uint(32位數),則移位數有第二個運算元的低5位給出(原因是:低5位可表示的數的範圍是0~24+23+22+21+20,即0~31,足夠乙個 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
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補最低位 如果移動的位數超過了該型別的最大位數,那麼...
移位運算子
二進位制運算子,包括位運算子和移位運算子,使程式設計師可以在二進位制基礎上運算元字,可以更有效的進行運算,並且可以以二進位制的形式儲存和轉換資料,是實現網路協議解析以及加密等演算法的基礎。左移 帶符號右移 和 無符號右移 左移 在數字沒有溢位的前提下,對於正數和負數,左移一位都相當於乘以2的1次方,...