单片机中整数循环左移 单片机C语言

\u6574\u6570\u53f3\u79fb\u95ee\u9898?

m>>n
\u610f\u601d\u662f\u5c06m\u7684\u4e8c\u8fdb\u5236\u6570\u53f3\u79fbn\u4f4d

\u6bd4\u5982\u8bf48>>2 \u7ed3\u679c\u662f2
\uff088\u4e8c\u8fdb\u5236\u4e3a1000\uff0c\u53f3\u79fb2\u4f4d\uff0c\u53730010\uff0c\u4e5f\u5c31\u662f\u5341\u8fdb\u5236\u76842\uff09

#include
c51\u4e2d\u7684intrins.h\u5e93\u51fd\u6570
_crol_ \u5b57\u7b26\u5faa\u73af\u5de6\u79fb
_cror_ \u5b57\u7b26\u5faa\u73af\u53f3\u79fb
_irol_ \u6574\u6570\u5faa\u73af\u5de6\u79fb
_iror_ \u6574\u6570\u5faa\u73af\u53f3\u79fb
_lrol_ \u957f\u6574\u6570\u5faa\u73af\u5de6\u79fb
_lror_ \u957f\u6574\u6570\u5faa\u73af\u53f3\u79fb
_nop_ \u7a7a\u64cd\u4f5c8051 NOP \u6307\u4ee4
_testbit_ \u6d4b\u8bd5\u5e76\u6e05\u96f6\u4f4d8051 JBC \u6307\u4ee4
\u8be6\u89e3\uff1a


\u51fd\u6570\u540d\uff1a _crol_\uff0c_irol_\uff0c_lrol_
\u539f \u578b\uff1a unsigned char _crol_(unsigned char val,unsigned char n);
unsigned int _irol_(unsigned int val,unsigned char n);
unsigned int _lrol_(unsigned int val,unsigned char n);
\u529f \u80fd\uff1a_crol_\uff0c_irol_\uff0c_lrol_\u4ee5\u4f4d\u5f62\u5f0f\u5c06val \u5de6\u79fbn \u4f4d\uff0c\u8be5\u51fd\u6570\u4e0e8051\u201cRLA\u201d\u6307\u4ee4
\u76f8\u5173\uff0c\u4e0a\u9762\u51e0\u4e2a\u51fd\u6570\u4e0d\u540c\u4e8e\u53c2\u6570\u7c7b\u578b\u3002
\u4f8b\uff1a
#include
main()
{
unsigned int y;
C-5 1 \u7a0b\u5e8f\u8bbe\u8ba1 37
y=0x00ff;
y=_irol_(y,4); /*y=0x0ff0*/
}

\u51fd\u6570\u540d\uff1a _cror_\uff0c_iror_\uff0c_lror_
\u539f \u578b\uff1a unsigned char _cror_(unsigned char val,unsigned char n);
unsigned int _iror_(unsigned int val,unsigned char n);
unsigned int _lror_(unsigned int val,unsigned char n);
\u529f \u80fd\uff1a_cror_\uff0c_iror_\uff0c_lror_\u4ee5\u4f4d\u5f62\u5f0f\u5c06val \u53f3\u79fbn \u4f4d\uff0c\u8be5\u51fd\u6570\u4e0e8051\u201cRRA\u201d\u6307\u4ee4
\u76f8\u5173\uff0c\u4e0a\u9762\u51e0\u4e2a\u51fd\u6570\u4e0d\u540c\u4e8e\u53c2\u6570\u7c7b\u578b\u3002
\u4f8b\uff1a
#include
main()
{
unsigned int y;
y=0x0ff00;
y=_iror_(y,4); /*y=0x0ff0*/
}

\u51fd\u6570\u540d\uff1a _nop_
\u539f \u578b\uff1a void _nop_(void);
\u529f \u80fd\uff1a_nop_\u4ea7\u751f\u4e00\u4e2aNOP \u6307\u4ee4,\u8be5\u51fd\u6570\u53ef\u7528\u4f5cC \u7a0b\u5e8f\u7684\u65f6\u95f4\u6bd4\u8f83\u3002C51 \u7f16\u8bd1\u5668\u5728_nop_
\u51fd\u6570\u5de5\u4f5c\u671f\u95f4\u4e0d\u4ea7\u751f\u51fd\u6570\u8c03\u7528\uff0c\u5373\u5728\u7a0b\u5e8f\u4e2d\u76f4\u63a5\u6267\u884c\u4e86NOP \u6307\u4ee4\u3002
\u4f8b\uff1a
P()=1;
_nop_();
P()=0;

\u51fd\u6570\u540d\uff1a _testbit_
\u539f \u578b\uff1abit _testbit_(bit x);
\u529f \u80fd\uff1a_testbit_\u4ea7\u751f\u4e00\u4e2aJBC \u6307\u4ee4\uff0c\u8be5\u51fd\u6570\u6d4b\u8bd5\u4e00\u4e2a\u4f4d\uff0c\u5f53\u7f6e\u4f4d\u65f6\u8fd4\u56de1\uff0c\u5426\u5219\u8fd4\u56de0\u3002
\u5982\u679c\u8be5\u4f4d\u7f6e\u4e3a1\uff0c\u5219\u5c06\u8be5\u4f4d\u590d\u4f4d\u4e3a0\u30028051 \u7684JBC \u6307\u4ee4\u5373\u7528\u4f5c\u6b64\u76ee\u7684\u3002
_testbit_\u53ea\u80fd\u7528\u4e8e\u53ef\u76f4\u63a5\u5bfb\u5740\u7684\u4f4d\uff1b\u5728\u8868\u8fbe\u5f0f\u4e2d\u4f7f\u7528\u662f\u4e0d\u5141\u8bb8\u7684\u3002

_crol_ 字符循环左移
_cror_ 字符循环右移
_irol_ 整数循环左移
_iror_ 整数循环右移
_lrol_ 长整数循环左移
_lror_ 长整数循环右移

你的这个结果是错的
a = 0xA5A5;
b = _irol_(a,1) ; 执行后 b=0x4b4b;

按照你的结果应给是这样:
a = 0xA5A5;
b = _iror_(a,1) ; 执行后 b=0xd2d2;

PS: _iror_(a,1) 表示把变量a 循环右移1位

既然你懂位移位,你把操作数A5A5和结果转换成二进制就明白了:

A5A5: 1010010110100101
D2D2: 1101001011010010

其中D2D2是操作数a左移1位后得到的结果,末尾补零,最高位的1是标志位。

从结果看,这可是循环右移啊。

  • 51鍗曠墖鏈轰腑濡備綍璁剧疆鏁扮爜绠寰幆宸︾Щ?
    绛旓細51鍗曠墖鏈烘暟鐮佺寰幆宸︾Щ鏄寚灏嗕竴涓暟鐮佺渚濇鍚戝乏绉诲姩涓涓綅缃紝鍚屾椂灏嗘渶鍙宠竟鐨勬暟绉诲埌鏈宸﹁竟锛屽舰鎴愮被浼间簬婊氬姩鐨勬晥鏋溿備互涓嬫槸51鍗曠墖鏈烘暟鐮佺寰幆宸︾Щ鐨勮缁嗗疄鐜版柟娉曪細1. 瀹氫箟涓涓叓浣嶄簩杩涘埗鏁板瓧骞惰祴鍒濆0xFF锛岀敤鏉ラ┍鍔ㄥ叓涓暟鐮佺鐨勬樉绀恒2. 璁惧畾涓涓惊鐜紝灏嗗叓涓暟鐮佺鐨勫叓浣嶆暟鎹寜椤哄簭鍚戝乏绉诲姩涓涓...
  • 51鍗曠墖鏈轰腑,鏁扮爜绠寰幆宸︾Щ鏄粈涔堝姛鑳?
    绛旓細1瀹氫箟涓涓彉閲忓瓨鍌ㄥ緟绉讳綅鐨勬暟鍊硷紝骞跺皢鍏惰浆鎹负浜岃繘鍒舵暟褰㈠紡銆2灏嗕簩杩涘埗鏁扮爜绠$殑瀵瑰簲绔彛杈撳嚭鍏ㄩ儴娓呴浂銆3鍒╃敤浣嶈繍绠楃 << 灏嗘暟鍊煎悜宸︾Щ鍔ㄤ竴浣嶏紝骞跺皢鏈楂樹綅鐨勬暟鍊煎瓨鏀惧埌鏈浣庝綅銆4灏嗘柊鐨勬暟鍊奸氳繃绔彛杈撳嚭鍒扮浉搴旂殑鏁扮爜绠′笂銆5灏嗙▼搴忓欢鏃朵竴娈垫椂闂村悗閲嶅鎵ц涓婅堪姝ラ锛屼粠鑰屽疄鐜版暟瀛楀湪鏁扮爜绠′腑寰幆宸︾Щ鐨勬晥...
  • 鍗曠墖鏈洪噷RL A鏄寰幆鍚宸︾Щ涓浣(涓嶅甫杩涗綅),涓轰粈涔堢浉褰撲簬鎶夾涔2?_鐧惧害...
    绛旓細<< 锛 鏄乏绉绘寚浠わ紝浣庝綅琛ラ浂銆傜Щ鍑哄幓鐨勫氨娑堝け浜銆俁OL锛 寰幆宸︾Щ鎸囦护锛屼綆浣嶈ˉ楂樹綅绉婚櫎鐨勬暟鎹傝繖鏄洜涓鸿绠楁満鐨勬暟鍊煎湪鍗曠墖鏈洪噷閮芥槸浜岃繘鍒剁殑鏁板硷紝瀵瑰畠杩涜宸︾Щ涓浣,锛岀浉褰撲簬姣忎竴浣嶉兘杩涗簡涓浣嶃備緥濡傛暟鍊2锛岀敤浜岃繘鍒惰〃绀轰负0010锛屽乏绉讳竴浣嶅彉鎴愪簡4锛屽嵆0100銆備緥濡傦細 1000,0001 b锛宎 = 1000,0001 ...
  • 璇烽棶C51鍗曠墖鏈虹殑寰幆宸︾Щ鍜屽惊鐜彸绉诲嚱鏁颁腑鐨勨滃惊鐜濇槸鎸囦粈涔?_鐧惧害鐭 ...
    绛旓細C51鍗曠墖鏈虹殑寰幆宸︾Щ鍑芥暟鏄紝_crol_(鍙橀噺鍚嶏紝n)锛屽惊鐜彸绉诲嚱鏁版槸锛宊cror_(鍙橀噺鍚嶏紝n)锛屽嚱鏁颁腑鐨勨滃惊鐜濇槸鎸囧彉閲忕殑8浣嶄簩杩涘埗鏁颁緷娆″悜宸︾Щ涓浣嶏紝鎴栧悜鍙崇Щ涓浣嶃備綘姣斿鐨勶紝鍙8浣嶆暟锛岃1111 1110寰幆宸︾Щ涓浣嶏紝灏辨槸鍦1111 1110銆1111 1101銆1111 1011銆1111 0111銆1110 1111锛岀瓑绛夛紝姣忕Щ浣嶄竴娆★紝...
  • 鍗曠墖鏈轰腑瀵16浣嶆暟杩涜寰幆宸︾Щ鍜岀畻鏈乏绉荤殑鍖哄埆
    绛旓細姣斿1010 0100 1010 1100锛屽惊鐜乏绉讳竴浣嶅氨鏄珮浣(绗15浣)绉诲嚭鏀惧埌鏈浣庝綅(绗0浣)锛屽叾瀹冧綅渚濇寰楂樹綅绉诲姩涓浣锛岀粨鏋滄槸0100 1001 0101 1001锛屽惊鐜乏绉讳袱浣嶅氨鍙樻垚浜1001 0010 1011 0010锛岀畻鏈乏绉诲氨鏄Щ鍑哄幓鐨勯珮浣嶄涪澶憋紝渚濇寰鏈浣庝綅琛0锛岀畻鏈乏绉讳竴浣嶇粨鏋滄槸0100 1001 0101 1000锛岀畻鏈乏绉讳袱浣嶆槸...
  • 鍗曠墖鏈轰腑鏁存暟寰幆宸︾Щ_irol,鏁存暟寰幆鍙崇Щ_iror銆傝繖涓暣鏁版庝箞绉讳綅鐨勫憿...
    绛旓細_iror_ 鏁存暟寰幆鍙崇Щ _lrol_ 闀鏁存暟寰幆宸︾Щ _lror_ 闀挎暣鏁板惊鐜彸绉 浣鐨杩欎釜缁撴灉鏄敊鐨 a = 0xA5A5;b = _irol_(a,1) ; 鎵ц鍚 b=0x4b4b;鎸夌収浣犵殑缁撴灉搴旂粰鏄繖鏍凤細a = 0xA5A5;b = _iror_(a,1) ; 鎵ц鍚 b=0xd2d2;PS: _iror_(a,1) 琛ㄧず鎶婂彉閲廰 寰幆鍙崇Щ...
  • 鍗曠墖鏈c璇█閲岀殑寰幆宸︾Щ鎸囦护_crol_鐨勬牸寮忔槸?杩欐寚浠ゆ槸姣忕寰幆宸︾Щ涓娆...
    绛旓細姹囩紪蹇樿浜 c鐨璇 dat<<1 涓嶆槸姣忕寰幆宸︾Щ锛1浠h〃宸︾Щ1浣嶏紝瓒呭嚭閮ㄥ垎蹇界暐 --- 甯哥敤鐨勫満鍚堬細u8 a;for( u8 i=0,j=0x01; i<8; i++,j<<=1 ){ if( a&j ){ //a鐨勭i浣嶄负1 } } --- 杩愮畻鐨勬椂鍊欎篃甯哥敤鍒 宸︾Щ涓浣 鍙涓嶈秴鍑鸿寖鍥 鐩稿綋浜幟2 ...
  • 鍗曠墖鏈哄惊鐜乏绉
    绛旓細澧炲姞涓涓叏灞鍙橀噺锛屽皢寰幆甯告暟缁欏彉閲忥紝鍐嶅鍙橀噺鍋宸﹀惊鐜锛屽皢鍙橀噺璧嬪肩粰P0,uchar a,b锛 c;鍦ㄤ富寰幆涓璓0=_crol_(P0,1); //P0鐨鍊煎悜宸﹀惊鐜Щ鍔 淇敼涓 c=_crol_(c,1); //P0鐨勫煎悜宸﹀惊鐜Щ鍔 P0=c;
  • 璇烽棶鍦鍗曠墖鏈轰腑,鎬庢牱鐢ㄥ乏绉(鍙崇Щ)涓庣畝鍗曢昏緫杩愮畻瀹炵幇寰幆宸︾Щ(鍙崇Щ)
    绛旓細璁炬湁鏁版嵁璇存槑锛歶nsigned char a,b锛涚幇瑕佹妸a寰幆宸︾Щ2浣嶏紝鍙互鐢ㄥ涓嬭鍙ユ瀹屾垚锛歜=a>>(8-2);// 鐢ㄦ潵寰楀埌姝e父宸︾Щ涓㈠け鐨浣嶅拰寰幆绉浣嶅悗鍏舵纭綅缃 a=a<<2; // 宸︾Щ a=a|b;=> a=(a<<2)|(a>>(8-2));...
  • 鍗曠墖鏈 宸︾Щ鍑芥暟鏄庝箞鐢鐨
    绛旓細宸﹀惊鐜鏈緛鍑芥暟锛氬嚱鏁板師鍨嬶細unsigned char _crol_(unsigned char a,unsigned char n);鍗曠墖鏈哄乏绉鍑芥暟鐢ㄦ硶锛氫緥濡傦紝P2=0xff锛 P2=_crol_(P2,1);//璇硶鏄鐨锛屼絾杩欐槸娌℃剰涔夌殑锛屽洜涓烘墽琛岀▼搴忓悗P2杩樻槸鍘熷0xff P2=0xfe; P2=_crol_(P2,1);//鎵ц绋嬪簭鍚嶱2=0xfd ...
  • 扩展阅读:正反转延时五秒反转图 ... 循环左移和左移的区别 ... 单片机循环左移怎么写 ... for循环中的有两个i++ ... 数组循环左移最优解法 ... 循环左移代码 ... 51单片机左移右移 ... 单片机循环左移指令 ... 51单片机流水灯左右循环 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网