位移位運算符
移位運算怎么計算
移位運算符的運算規則
按二進制形式把所有的數字向左移動對應的位數,高位移出(舍棄),低位的空位補零。 右移一位相當于除2,右移n位相當于除以2的n次方。 l >>> 運算規則: 按二進制形式把所有的數字向右移動對應巍峨位數,低位移出(舍棄),高位的空位補零。對于正數來說和帶符號右移相同,對于負數來說不同。 其他結構和>>相似。
有的時候,你希望將一個數的二進制值向右或向左移位。執行左移時,在一個數的二進制形式中,所有位都向左移動由移位運算符右側的操作數指定的位數。 移位后在右邊留下的空位將由零來填充。右移位運算符的原理相似,只是朝相反的方向移位。然而,如果數是負數,那么在左側填充的值就是1而不是0。兩個移位 運算符是>>和<<,它們分別是右移位和左移位運算符。除此之外,還有復合移位和賦值運算符<<=和>& gt;=。
來看看下面的例子。假定現在有一個int值-7,它的二進制形式為1111 1111 1111 1111 1111 1111 1111 1001。在代碼清單3-36中,我們使-7右移2個位置。
代碼清單3-36 使用右移位運算符 int x;x = (-7 >> 2); // 11111111111111111111111111111001 becomes// 11111111111111111111111111111110// Write out "x is -2."System.Console.WriteLine("x = {0}.", x);輸出3-17展示了代碼清單3-36的結果。
輸出3-17 x = -2. 向右移位時,最右邊的比特值會在邊界處“離開”,左邊的負數位標識符向右移動兩個位置,騰出來的空白位置用1來填充。最終結果是-2。
C語言的移位操作符使用方法
移位時,移出的位數全部丟棄,移出的空位補入的數與左移還是右移花接木有關。如果是左移,則規定補入的數全部是0;如果是右移,還與被移位的數據是否帶符號有關。若是不帶符號數,則補入的數全部為0;若是帶符號數,則補入的數全部等于原數的最左端位上的原數(即原符號位)。具體移位規則如下所示。
位移位運算符的優先級如下:
·算術運算符 優先于 位移位運算符 優先于 關系運算符
·位移位運算符是同級別的,結合性是自左向右
例如,設無符號短整型變量a為0111(對應二進制數為0000000001001001),
則:a<<3 結果為01110(對應二進制數為0000001001001000),a不變
a>>4 結果為04 (對應二進制數為0000000000000100),a不變
又如,設短整型變量a為-4(對應二進制數為 1111111111111100),
則:a<<3 結果為-32(對應二進制數為1111111111100000),a不變
a>>4 結果為-1(對應二進制數為1111111111111111),a不變
C語言里的左移和右移運算
2006-09-30 13:52
先說左移,左移就是把一個數的所有位都向左移動若干位,在C中用<<運算符.例如:
int i = 1;
i = i << 2; //把i里的值左移2位
也就是說,1的2進制是000...0001(這里1前面0的個數和int的位數有關,32位機器,gcc里有31個0),左移2位之后變成 000... 0100,也就是10進制的4,所以說左移1位相當于乘以2,那么左移n位就是乘以2的n次方了(有符號數不完全適用,因為左移有可能導致符號變化,下面解釋原因)
需要注意的一個問題是int類型最左端的符號位和移位移出去的情況.我們知道,int是有符號的整形數,最左端的1位是符號位,即0正1負,那么移位的時候就會出現溢出,例如:
int i = 0x40000000; //16進制的40000000,為2進制的01000000...0000
i = i << 1;
那么,i在左移1位之后就會變成0x80000000,也就是2進制的100000...0000,符號位被置1,其他位全是0,變成了int類型所能表示的最小值,32位的int這個值是-2147483648,溢出.如果再接著把i左移1位會出現什么情況呢?在C語言中采用了丟棄最高位的處理方法,丟棄了1之后,i的值變成了0.
左移里一個比較特殊的情況是當左移的位數超過該數值類型的最大位數時,編譯器會用左移的位數去模類型的最大位數,然后按余數進行移位,如:
int i = 1, j = 0x80000000; //設int為32位
i = i << 33; // 33 % 32 = 1 左移1位,i變成2
j = j << 33; // 33 % 32 = 1 左移1位,j變成0,最高位被丟棄
在用gcc編譯這段程序的時候編譯器會給出一個warning,說左移位數>=類型長度.那么實際上i,j移動的'就是1位,也就是33%32 后的余數.在gcc下是這個規則,別的編譯器是不是都一樣現在還不清楚.
總之左移 就是: 丟棄最高位,0補最低位
再說右移,明白了左移的道理,那么右移就比較好理解了.
右移的概念和左移相反,就是往右邊挪動若干位,運算符是>>.
右移對符號位的處理和左移不同,對于有符號整數來說,比如int類型,右移會保持符號位不變,例如:
int i = 0x80000000;
i = i >> 1; //i的值不會變成0x40000000,而會變成0xc0000000
就是說,符號位向右移動后,正數的話補0,負數補1,也就是匯編語言中的算術右移.同樣當移動的位數超過類型的長度時,會取余數,然后移動余數個位.
負數10100110 >>5(假設字長為8位),則得到的是 11111101
總之,在C中,左移是邏輯/算術左移(兩者完全相同),右移是算術右移,會保持符號位不變 .實際應用中可以根據情況用左/右移做快速的乘 /除運算,這樣會比循環效率高很多.
在很多系統程序中常要求在位(bit)一級進行運算或處理。C語言提供了位運算的功能, 這使得C語言也能像匯編語言一樣用來編寫系統程序。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
操作符 作用
────────────────────────────
& 位邏輯與
| 位邏輯或
^ 位邏輯異或
- 位邏輯反
>> 右移
<< 左移
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
按位運算是對字節或字中的實際位進行檢測、設置或移位, 它只適用于字符型和整數型變量以及它們的變體, 對其它數據類型不適用。
我們要注意區分位運算和邏輯運算。
1.按位與運算
按位與運算符"&"是雙目運算符。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 ,否則為0。參與運算的數以補碼方式出現。
例如:9&5可寫算式如下: 00001001 (9的二進制補碼)&00000101 (5的二進制補碼) 00000001 (1的二進制補碼)可見9&5=1。
按位與運算通常用來對某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 運算 ( 255 的二進制數為0000000011111111)。
main(){
int a=9,b=5,c;
c=a&b;
printf("a=%d b=%d c=%d ",a,b,c);
}
2. 按位或運算
按位或運算符“|”是雙目運算符。其功能是參與運算的兩數各對應的二進位相或。只要對應的二個二進位有一個為1時,結果位就為1。參與運算的兩個數均以補碼出現。
例如:9|5可寫算式如下: 00001001|00000101
00001101 (十進制為13)可見9|5=13
main(){
int a=9,b=5,c;
c=a|b;
printf("a=%d b=%d c=%d ",a,b,c);
}
3. 按位異或運算
按位異或運算符“^”是雙目運算符。其功能是參與運算的兩數各對應的二進位相異或,當兩對應的二進位相異時,結果為1。參與運算數仍以補碼出現,例如 9^5可寫成算式如下: 00001001^00000101 00001100 (十進制為12)
main(){
int a=9;
a=a^15;
printf("a=%d ",a);
}
4. 求反運算
求反運算符~為單目運算符,具有右結合性。 其功能是對參與運算的數的各二進位按位求反。例如~9的運算為: ~(0000000000001001)結果為:1111111111110110
5. 左移運算
左移運算符“<<”是雙目運算符。其功能把“<< ”左邊的運算數的各二進位全部左移若干位,由“<<”右邊的數指定移動的位數,高位丟棄,低位補0。例如: a<<4 指把a的各二進位向左移動4位。如a=00000011(十進制3),左移4位后為00110000(十進制48)。
6. 右移運算
右移運算符“>>”是雙目運算符。其功能是把“>> ”左邊的運算數的各二進位全部右移若干位,“>>”右邊的數指定移動的位數。例如:設 a=15,a>>2 表示把000001111右移為00000011(十進制3)。應該說明的是,對于有符號數,在右移時,符號位將隨同移動。當為正數時, 最高位補0,而為負數時,符號位為1,最高位是補0或是補1 取決于編譯系統的規定。
main(){
unsigned a,b;
printf("input a number: ");
scanf("%d",&a);
b=a>>5;
b=b&15;
printf("a=%d b=%d ",a,b);
}
請再看一例!
main(){
char a='a',b='b';
int p,c,d;
p=a;
p=(p<<8)|b;
d=p&0xff;
c=(p&0xff00)>>8;
printf("a=%d b=%d c=%d d=%d ",a,b,c,d);
}
當進行按位與或時,最好使用16進制,在程序中這樣表示:0x01 表示0000 0001
所以,字符類型a的最高位強制1可以這樣:a=a|0x80。其他的可以依次類推!
“移位運算符在移位操作中,無論左移還是右移,所移出的空位一律補0”這句話是否正確?
移位操作在程序設計中,位操作運算符的一種;
在c++中,移位運算符有雙目移位運算符:<<(左移)和>>(右移)。移位運算符組成的表達式也屬于算術表達式,其值為算術值;
左移運算是將一個二進制位的操作數按指定移動的位數向左移位,移出位被丟棄,右邊的空位一律補0。3.右移運算是將一個二進制位的操作數按指定移動的位數向右移動,移出位被丟棄,左邊移出的空位或者一律補0,或者補符號位,這由不同的機器而定;
在使用補碼作為機器數的機器中,正數的符號位為0,負數的符號位為1。
verilog中移位操作符號
verilog中移位操作符號有2種,分別是“<<”左移位運算符和“>>”右移位運算符。
格式如下:a<<n,a>>n。其中,a代表要移位的操作數,n代表要移幾位。兩種運算方式都用0來填補移出的空位。
移位操作符對左邊的操作數進行向左或向右的位移位操作,第二個操作數,移位位數是無符號數,遵循的操作規律是“左移時先補后移,右移時先移后補”。
在進行移位運算時,應當注意移位前后變量的位數。如果操作數已經定義了位寬,則進行移位后操作數改變,但是其位寬不變。
擴展資料
verilog HDL運算符
1、邏輯運算符:&&邏輯與;||邏輯或;!邏輯非。
2、關系運算符:<小于、>大于、<=小于等于、>=大于等于。
3、等式運算符:==等于、!=不等于、===等于、!==不等于。
4、移位運算符:<<左移位、>>右移位。
5、位拼接運算符:{a1,a2,a3.......}
6、縮減運算符:先將操作數的第一位與第二位進行與、或、非運算,然后將結果與第三位進行與、或、非運算,依次類推,直至最后一位。
參考資料來源:《Verilog數字系統設計教程 【第3版】》 夏宇聞 編著 北京航空航天出版社
第4章 運算符、賦值語句和結構說明語句 4.4 移位運算符
參考資料來源:百度百科--Verilog HDL
本文發布于:2023-02-28 18:57:00,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/167759170450018.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:移位運算符(移位運算符的優先級).doc
本文 PDF 下載地址:移位運算符(移位運算符的優先級).pdf
| 留言與評論(共有 0 條評論) |