單片機c語言中的左移右移

2020-12-16 電子產品世界

左移
變量1 << 變量2
將變量1的二進位位值向左移動由變量2所指定的位數。
例如:
a = 0x8f; // 10001111
a << 2; // 左端移出的值丟棄,右端補0
結果:a = 0x3c (00111100)

本文引用地址:

http://www.eepw.com.cn/article/201611/321270.htm

keil c51中,內部函數庫INTRINS.H中_crol_(m,n)表示將m循環左移n位,
與m<


右移
變量1 >> 變量2
將變量1的二進位位值向右移動由變量2所指定的位數。
例1:
unsigned char a;
a = 0x8f; // 10001111
a >> 2; // 右端移出的值丟棄,左端補0
結果:a = 0x23 (00100011)

例2:
char a;
a = 0x8f; // 10001111
a >> 2; // 右端移出的值丟棄,左端補入原來的符號位
// 據說有些編譯器採用邏輯右移,即左端補0
結果:a = 0xe3 (11100011)

1當左移移出的是「1」而不是0時,你該怎麼想?
2 當左移的操作數是一個sign型是,你該怎麼想?
3 在單片機中和在C語言中是完全一樣的嗎?
4 左移與右移在內存中的關係?
5 什麼時候左移相當於乘2?
6 有興趣的話可以研究一下單片機彙編中的循環左右移!
左移
先說左移,左移就是把一個數的所有位都向左移動若干位,在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位,也就是332後的餘數.在gcc下是這個規則,別的編譯器是不是都一樣現在還不清楚.
總之左移就是: 丟棄最高位,0補最低位
在keil c51中,內部函數庫INTRINS.H中_crol_(m,n)表示將m循環左移n位,
與m<再說右移,明白了左移的道理,那麼右移就比較好理解了.
右移
右移的概念和左移相反,就是往右邊挪動若干位,運算符是>>.
右移對符號位的處理和左移不同,對於有符號整數來說,比如int類型,右移會保持符號位不變,例如:
int i = 0x80000000;
i = i >> 1; //i的值不會變成0x40000000,而會變成0xc0000000
就是說,符號位向右移動後,正數的話補0,負數補1,也就是彙編語言中的算術右移.同樣當移動的位數超過類型的長度時,會取餘數,然後移動餘數個位.
負數10100110 >>5(假設字長為8位),則得到的是 11111101
總之,在C中,左移是邏輯/算術左移(兩者完全相同),右移是算術右移,會保持符號位不變.實際應用中可以根據情況用左/右移做快速的乘/除運算,這樣會比循環效率高很多
總結
1移位操作符的兩個操作數必須是整型的。整個移位表達式的值的類型也是整型的,而且,左移位操作符與右移位操作符的運算並不對稱。
2 一切以在內存中的存儲形式有關!

相關焦點

  • 編程基礎 - C/C++中的左移和右移運算符
    左移運算符(<<) 左移運算符是用來將一個數的各二進位位左移若干位,移動的位數由右操作數指定(右操作數必須是非負值),其右邊空出的位用0填補,高位左移溢出則捨棄該高位。(>>) 右移運算符是用來將一個數的各二進位位右移若干位,移動的位數由右操作數指定(右操作數必須是非負值),移到右端的低位被捨棄,對於無符號數,高位補0。
  • 單片機C語言左移和右移漫談
    #include#define uchar unsigned char#define uint unsigned intvoid main(void){ uchar a; a=0x01; a=a<<1;}在這段程序中,看起來沒有什麼問題,但是編譯後不能生成代碼
  • 結合單片機學習板學習c語言之流水燈製作--intrins.h頭文件
    SCON=0XF8;  PCON=0X80;  EA=1;  ES=1;  RI=0;  b=0xfe;  while(1)  {  P1=b;  b=_crol_(b,1);//字符中的位左移1位(偽本徵函數)  for(c=0;c<30000;c++)
  • C語言中的運算符
    一、前言在嵌入式開發中,我們一般選用C語言作為開發語言。一個主要的原因在於C語言提供了大量的運算符,比如我們對硬體的操作一般涉及到對位的操作,而C語言就提供了這樣的運算符,這是其他語言不具備的。移位運算符右移與左移是對位進行操作。例如:a=10,b=a>>1,此例的意思是把數值a往右移動1位,把結果賦值給b。我們知道數據在內存中以二進位存放,10對應的二進位位1010,各位往右移一位得到0101,最右邊的0被移出去,左邊空的一位我們補0,所以b的值為0101,即5。
  • 單片機C語言實現循環移位!
    循環左移時,用從左邊移出的位填充字的右端,而循環右移時,用從右邊移出的位填充字的左側。這種情況在系統程序中時有使用,在一些控制程序中用得也不少。  設有數據說明:a=01111011,循環左移2位 正確結果: 11101101過程:b=a>>(8-2) 用來得到正常左移丟失的位和循環移位後其正確位置 b=00000001;a=a<<2;左移 a=11101100
  • c語言之符號的技巧
    C語言中的單引號用來表示字符常量C語言中的雙引號用來表示字符串常量『a』表示字符常量在內存中佔1個字節
  • 寫出高效優美的單片機C語言代碼
    在ICCAVR中,可以在Options中設定使用printf參數,儘量使用基本型參數(%c、%d、%x、%X、%u和%s格式說明符),少用長整型參數(%ld、%lu、%lx和%lX格式說明符),至於浮點型的參數(%f)則儘量不要使用,其它C編譯器也一樣。在其它條件不變的情況下,使用%f參數,會使生成的代碼的數量增加很多,執行速度降低。
  • 初學51單片機指令快速記憶法
    學習單片機,除了搞清單片機內部功能、存儲空間分配及I/O接口外,還應掌握其指令系統。MCS-51共有111條指令,現介紹我們總結出的快速記憶MCS-51指令的方法,供大家參考。  大家都知道,彙編語言指令由操作碼、操作數兩部分組成。
  • 單片機C語言實現求平方根算法
    C語言中要求平方根,可以在頭文件中加入#include <math.h>.然後調用sqrt(n);函數即可。但在單片機中調用此函數無疑會耗費大量資源和時間,是極不合適的。的開方:1 0 1 0 --------------- | 1 10 01 00 1 --------------- 100| 0 10 | 0 00 --------------- | 10 011001| 10 01 --------------- 0 00這裡每一步不再是把p乘以20了,而是把p乘以4,也就是把p右移兩位
  • 單片機C語言求平方根函數
    在單片機中要開平方.可以用到下面算法: --------------- 0 00這裡每一步不再是把p乘以20了,而是把p乘以4,也就是把p右移兩位
  • c語言運算符號
    包括位與(&)、位或(|)、位非(~)、位異或(^)、左移(<<)、右移(>>)六種。賦值運算符用於賦值運算,分為簡單賦值(=)、複合算術賦值(+=,-=,*=,/=,%=)和複合位運算賦值(&=,|=,^=,>>=,<<=)三類共十一種。
  • 51單片機protues仿真——分組控制LED燈
    這裡採用的是protues軟體對51單片機進行仿真,代碼是利用keil進行編程,其語法格式為C語言。=P1) continue;//取得4位按鍵值,由模式XXXX1111(X中有一位為0,其他均為1)//變為模式0000XXXX(X中有一位為1,其他均為0)Key_State=~t>>4;k=0;
  • MCS-51單片機控制跑馬燈的三種方法
    在MCS一51單片機的控制系統中,它的四個並行8位輸入輸出埠P0一P3是我們經常使用的。在並行埠的編程學習中,「跑馬燈」是單片機並行埠輸出控制的典型實例。所謂跑馬燈,是指將八個發光二極體分別連接到單片機的某一併行埠的八根線上,通過編程控制這八個發光二極體從低到高或從高到低依次點亮。
  • C語言入門教程運算符
    當表達式中有多個相同優先級的運算符時,按照從左到右的順序運算。6)<=:檢查左操作數的值是否小於或等於右操作數的值,如果是則條件為真。關係運算符只有兩種結果:true或者false。true代表條件為真,false代表條件為假。C語言中,一般非0值代表true,0代表false。
  • 【連載14】LED 小燈的原理解析 | 學單片機做四軸飛行器項目故事
    本資料以個人學習、 工作經驗以及宏晶科技單片機技術為素材, 以單片機初學者、單片機項目開發者為對象, 教大家如何走進單片機,繼而達到開發工程項目(如:四軸飛行器設計,多功能收音機等)為目的。 限於時間和水平關係,資料中難免有過失之處,望各位高手批評指教,多多拍磚,拍累了,你們休息,我繼續上路。
  • 如何理解C語言中的移位運算?它們的用途是什麼?
    C語言中有三種位移運算:左移、邏輯右移和算術右移。左移和邏輯右移是完全相反的,但算術右移有點不一樣。左移的符號是「<<」,邏輯右移和算術右移都是「>>」。左移:如果把a<<4,即把[01100011]進行左移4位,這樣a就會變成[00110000]。這是如何變成的呢?這是把[01100011]最左邊的那4位砍掉,在剩下的4位的右邊補充4個零。
  • 單片機C語言實現的CRC算法
    在接收端,則根據信息碼和CRC碼之間所遵循的規則進行檢驗,以確定傳送中是否出錯。16位的CRC碼產生的規則是先將要發送的二進位序列數左移16位(既乘以 )後,再除以一個多項式,最後所得到的餘數既是CRC碼,如式(2-1)式所示,其中B(X)表示n位的二進位序列數,G(X)為多項式,Q(X)為整數,R(X)是餘數(既CRC碼)。
  • C語言基礎知識學習(四)
    在C語言中,NULL和0的值都是一樣的,NULL用於指針,0用於數值。對於字符串的結尾,使用'\0',它的值也是0,但是讓人一看就知道這是字符串的結尾,不是指針,也不是普通的數值.邏輯非運算結果0或1,單目運算,自右向左結合.&&和||的短路原理&&前面是0時,&&符號後面的不計算. ||前面不是0時,||號後面的不計算.
  • 單片機實驗簡明過程
    ,它集編輯、編譯、仿真於一體,支持彙編語言、PLM語言、C語言的程序設計,界面友好,易學易用。2.實驗內容編寫程序,使D0-D8,8個LED呈現流水燈效果進行左移右移滾動3.實驗器材(1)計算機1臺 (2)仿真器1臺 (3)開發板1套4.實驗程序/****
  • 什麼是移就,移就修辭格
    移就修辭格在作品中經常出現,能收到以少勝多、含蘊深遠的表達效果。什麼是移就呢?在辭海解釋如下:甲乙兩項關聯,就把原來屬於形容甲事物的修飾語移屬乙事物,叫移就。唐鋮《修辭格》說:「兩個觀念聯繫在一起時,一個的形容詞常常移用於他一個上頭。」移就是一種超乎常格的語言現象,也是詞語搭配的創造性運用。