A. 位移位運算符
要了解移位運算,需明白二進制計數
以單位元組為例,比如0x55=0b01010101
如果將該數值左移1位,就變成了專 0b10101010(最右邊屬這個0是移空了以後補的),這個數值是0xaa
從數學上看,左移1位等於乘以2,右移1位等於除以2,然後再取整,移位溢出的丟棄。
例如:
unsigned char a;
a=1; //0b00000001
a<<=1; //0b00000010 a左移1位等效於a=a*2
a<<=2; //0b00001000 a左移2位等效於a=a*2的2次方(4)
a<<=3; //0b01000000 a左移1位等效於a=a*2的3次方(8)
a<<=1; //0b10000010 a左移1位等效於a=a*2
a<<=1; //0b00000000 a再次左移1位後溢出了,結果變成0了
c=a<<b; 在變數都是8位的時候,等效於 c=(a*pow(2,b))%256
B. 移位運算符怎麼移的
bytemask=intmax<<8;
intmax 按2進制復向左移制動 2進制八位,右邊補0,左邊高位溢出丟棄
intmax=4294967195;16進制 0xffffff9b
左移2進制八位, 就是左移16進制2位, 16進制 0xffff9b00
列印出的10進制就不太容易看。
左移1位實際上等於 乘2,左移8位就是 乘了 8 次 2。
高位溢出丟棄,丟棄多少,要看你的 uint 是幾位的。
C. 你好,我想請問如何實現用移位運算符實現簡單的循環移動
循環移位還是比較來容易自實現的
把移位後被刪除的部分 放到另外一邊就好了。
以32位整型循環右移為例 代碼如下:
unsignedintcror(unsignedintv,intl)//將v循環右移l位並返回結果
{
intt;
intr;
t=v<<(32-l));//取出最右l位並移動到最左。
r=v>>l;//右移l位
r|=t;//賦值到結果上。
returnr;
}
其實寫成一句話 就是
#definecror(v,l)((v<<(sizeof(v)*8-l))|(v>>l))
左移類似。
D. 移位運算的意義
僅舉2個邏輯運算的例子:
串列通信介面,發送緩沖器里得到的數據版以位元組為單權位,比如0xa1 (10100001),則在一根發送數據線上只能一個位一個位的往外送,比如MSbit在前,匯流排上會依次看到 1、0、1、0、0、0、0、1這8個bit,然後接收端再用移位寄存器依次接收8bit,恢復成位元組。
簡單易記的表示立即數。有時候微處理器的寄存器操作,需要給特定位置成特定的數,比如還是上面那個Reg = 0xa1,寫成二進制10100001讀起來挺麻煩,所以C語言里經常寫成這樣的形式: Reg = (1 << 7) + (1 << 5) + (1 << 0);
寫程序的人一看就知道,只把bit7、5、0置成1,其餘的位都是0
邏輯運算是無符號運算,沒有符號位的概念。只有數值運算才考慮符號位。
E. 移位運算符在移位操作中,無論左移還是右移,所移出的空位一律補0。這句話是否正確,請說明。 謝謝
移位來操源作在程序設計中,位操作運算符的一種;
在c++中,移位運算符有雙目移位運算符:<<(左移)和>>(右移)。移位運算符組成的表達式也屬於算術表達式,其值為算術值;
左移運算是將一個二進制位的操作數按指定移動的位數向左移位,移出位被丟棄,右邊的空位一律補0。3.右移運算是將一個二進制位的操作數按指定移動的位數向右移動,移出位被丟棄,左邊移出的空位或者一律補0,或者補符號位,這由不同的機器而定;
在使用補碼作為機器數的機器中,正數的符號位為0,負數的符號位為1。
F. Java移位運算符問題
有符號右移會保留最高位的符號位,從次高位開始逐位右移填0;而無符號右移會將符回號位一起右移,並將高位全答部填0。
例:對於一個byte類型的數10010100來說,有符號右移2位變為10000101,而無符號右移2位變為00100101。前者仍然是一個負數,而後者變成了正數。
左移只有有符號的,沒有無符號左移。
G. 什麼情況下使用移位運算符
各種編碼,編碼間的轉換時都會用到。
無論是字元編碼,比如GBK轉Unicode
基礎類型轉專換字元串,比如屬int轉字元串'123'
視頻音頻編碼,壓縮編碼,加密編碼
網路協議、數據文件格式,比如BMP,WAV。。。
任何數據的顯示、存儲各種形式的轉換都會用到位運算
精確到bit的操作都要用到位運算。
位運算是最基礎計算機操作。。
H. 「移位運算符在移位操作中,無論左移還是右移,所移出的空位一律補0」這句話是否正確
不完全正確。
1、移位操作在程序設計中,移位操作運算符的一種。
2、在c++中,移位運內算符有雙容目移位運算符:<<(左移)和>>(右移)。移位運算符組成的表達式也屬於算術表達式,其值為算術值。
3、首先要明白一點,這裡面所有的操作都是針對存儲在計算機中中二進制的操作,那麼就要知道,正數在計算機中是用二進製表示的,負數在計算機中使用補碼表示的。
左移位:<<,有符號的移位操作;
左移操作時將運算數的二進制碼整體左移指定位數,左移之後的空位用0補充;
右移位:>>,有符號的移位操作;
右移操作是將運算數的二進制碼整體右移指定位數,右移之後的空位用符號位補充,如果是正數用0補充,負數用1補充。
無符號的移位只有右移:>>>
右移之後的空位全部補0。
4、你可以用一個立即值(從 0 到 31)指定移位數量,或用包含在 0 和 31 之間的一個值的寄存器指定移位數量。
邏輯或算術左移(LSL)
MOV R1, #12
MOV R0, R1, LSL#2
R0 是 48,這些指令形成的總和是R0 = #12, LSL#2 等同於 BASIC 的 R0 = 12 << 2