c语言怎么移位
⑴ C语言按位左移运算规则
C语言中按位左移的运算符为<<,其规则如下:
对于操作a<<n,
1 按照二进制值每位向高位(书写上是向左)移动n位;
2 最高位(最左边的)n位舍去;
3 最低位(最右边)填加n个0.
简单起见,用char型举例如下:
例一
0x12 << 3 =>
B00010010 << 3 =>
B10010 000(这里最高位的三个0被舍去,其它依次左移,最低位补三个0) =>
0x90
即0x12 << 3 = 0x90
例二
0x9E << 2 =>
B10011110 << 2 =>
B01111000 (最高位10舍去,最低位补两个0)=>
0x78
可以编写如下程序验证:
#include<stdio.h>
voidcheck(chara,intn)
{
printf("0x%hhx<<%d=0x%hhx ",a,n,a<<n);
}
intmain()
{
check(0x12,3);
check(0x9e,2);
return0;
}
其运行结果为
0x12<<3=0x90
0x9e<<2=0x78
可以看到与我们计算结果是相符的。
⑵ C璇瑷镄勭Щ浣嶆搷浣灭︿娇鐢ㄦ柟娉
銆銆绉讳綅镞讹纴绉诲嚭镄勪綅鏁板叏閮ㄤ涪寮冿纴绉诲嚭镄勭┖浣嶈ˉ鍏ョ殑鏁颁笌宸︾Щ杩樻槸鍙崇Щ鑺辨帴链ㄦ湁鍏炽傚傛灉鏄宸︾Щ锛屽垯瑙勫畾琛ュ叆镄勬暟鍏ㄩ儴鏄0;濡傛灉鏄鍙崇Щ锛岃缮涓庤绉讳綅镄勬暟鎹鏄钖﹀甫绗﹀彿链夊叧銆傝嫢鏄涓嶅甫绗﹀彿鏁帮纴鍒栾ˉ鍏ョ殑鏁板叏閮ㄤ负0;鑻ユ槸甯︾﹀彿鏁帮纴鍒栾ˉ鍏ョ殑鏁板叏閮ㄧ瓑浜庡师鏁扮殑链宸︾浣崭笂镄勫师鏁(鍗冲师绗﹀彿浣)銆傚叿浣撶Щ浣嶈勫垯濡备笅镓绀恒
銆銆浣岖Щ浣嶈繍绠楃︾殑浼桦厛绾у备笅锛
銆銆路绠楁湳杩愮畻绗︺浼桦厛浜庛浣岖Щ浣嶈繍绠楃 浼桦厛浜 鍏崇郴杩愮畻绗
銆銆路浣岖Щ浣嶈繍绠楃︽槸钖岀骇鍒镄勶纴缁揿悎镐ф槸镊宸﹀悜鍙
銆銆渚嫔傦纴璁炬棤绗﹀彿鐭鏁村瀷鍙橀噺a涓0111(瀵瑰簲浜岃繘鍒舵暟涓0000000001001001),
銆銆鍒欙细a<<3 缁撴灉涓01110(瀵瑰簲浜岃繘鍒舵暟涓0000001001001000)锛宎涓嶅彉
銆銆a>>4 缁撴灉涓04銆(瀵瑰簲浜岃繘鍒舵暟涓0000000000000100)锛宎涓嶅彉
銆銆鍙埚傦纴璁剧煭鏁村瀷鍙橀噺a涓-4(瀵瑰簲浜岃繘鍒舵暟涓 1111111111111100),
銆銆鍒欙细a<<3 缁撴灉涓-32(瀵瑰簲浜岃繘鍒舵暟涓1111111111100000)锛宎涓嶅彉
銆銆a>>4 缁撴灉涓-1(瀵瑰簲浜岃繘鍒舵暟涓1111111111111111)锛宎涓嶅彉
銆銆C璇瑷閲岀殑宸︾Щ鍜屽彸绉昏繍绠
銆銆2006-09-30 13:52
銆銆鍏堣村乏绉,宸︾Щ灏辨槸鎶娄竴涓鏁扮殑镓链変綅閮藉悜宸︾Щ锷ㄨ嫢骞蹭綅,鍦–涓鐢<<杩愮畻绗.渚嫔:
銆銆int i = 1;
銆銆i = i << 2; //鎶奿閲岀殑鍊煎乏绉2浣
銆銆涔熷氨鏄璇,1镄2杩涘埗鏄000...0001(杩欓噷1鍓嶉溃0镄勪釜鏁板拰int镄勪綅鏁版湁鍏,32浣嶆満鍣,gcc閲屾湁31涓0),宸︾Щ2浣崭箣钖庡彉鎴 000... 0100,涔熷氨鏄10杩涘埗镄4,镓浠ヨ村乏绉1浣岖浉褰扑簬涔树互2,闾d箞宸︾Щn浣嶅氨鏄涔树互2镄刵娆℃柟浜(链夌﹀彿鏁颁笉瀹屽叏阃傜敤,锲犱负宸︾Щ链夊彲鑳藉艰嚧绗﹀彿鍙桦寲,涓嬮溃瑙i喷铡熷洜)
銆銆闇瑕佹敞镒忕殑涓涓闂棰樻槸int绫诲瀷链宸︾镄勭﹀彿浣嶅拰绉讳綅绉诲嚭铡荤殑𨱍呭喌.鎴戜滑鐭ラ亾,int鏄链夌﹀彿镄勬暣褰㈡暟,链宸︾镄1浣嶆槸绗﹀彿浣,鍗0姝1璐,闾d箞绉讳綅镄勬椂鍊椤氨浼氩嚭鐜版孩鍑,渚嫔:
銆銆int i = 0x40000000; //16杩涘埗镄40000000,涓2杩涘埗镄01000000...0000
銆銆i = i << 1;
銆銆闾d箞,i鍦ㄥ乏绉1浣崭箣钖庡氨浼氩彉鎴0x80000000,涔熷氨鏄2杩涘埗镄100000...0000,绗﹀彿浣嶈缃1,鍏朵粬浣嶅叏鏄0,鍙樻垚浜唅nt绫诲瀷镓鑳借〃绀虹殑链灏忓,32浣岖殑int杩欎釜鍊兼槸-2147483648,婧㈠嚭.濡傛灉鍐嶆帴镌鎶奿宸︾Щ1浣崭细鍑虹幇浠涔堟儏鍐靛憿?鍦–璇瑷涓閲囩敤浜嗕涪寮冩渶楂树綅镄勫勭悊鏂规硶,涓㈠纯浜1涔嫔悗,i镄勫煎彉鎴愪简0.
銆銆宸︾Щ閲屼竴涓姣旇缉鐗规畩镄勬儏鍐垫槸褰揿乏绉荤殑浣嶆暟瓒呰繃璇ユ暟鍊肩被鍨嬬殑链澶т綅鏁版椂,缂栬疟鍣ㄤ细鐢ㄥ乏绉荤殑浣嶆暟铡绘ā绫诲瀷镄勬渶澶т綅鏁,铹跺悗鎸変綑鏁拌繘琛岀Щ浣,濡:
銆銆int i = 1, j = 0x80000000; //璁绲nt涓32浣
銆銆i = i << 33; // 33 % 32 = 1 宸︾Щ1浣,i鍙樻垚2
銆銆j = j << 33; // 33 % 32 = 1 宸︾Щ1浣,j鍙樻垚0,链楂树綅琚涓㈠纯
銆銆鍦ㄧ敤gcc缂栬疟杩欐电▼搴忕殑镞跺欑紪璇戝櫒浼氱粰鍑轰竴涓犸arning,璇村乏绉讳綅鏁>=绫诲瀷闀垮害.闾d箞瀹为檯涓奿,j绉诲姩镄'灏辨槸1浣,涔熷氨鏄33%32 钖庣殑浣欐暟.鍦╣cc涓嬫槸杩欎釜瑙勫垯,鍒镄勭紪璇戝櫒鏄涓嶆槸閮戒竴镙风幇鍦ㄨ缮涓嶆竻妤.
銆銆镐讳箣宸︾Щ 灏辨槸: 涓㈠纯链楂树綅,0琛ユ渶浣庝綅
銆銆鍐嶈村彸绉,鏄庣槠浜嗗乏绉荤殑阆撶悊,闾d箞鍙崇Щ灏辨瘆杈冨ソ鐞呜В浜.
銆銆鍙崇Щ镄勬傚康鍜屽乏绉荤浉鍙,灏辨槸寰鍙宠竟鎸锷ㄨ嫢骞蹭綅,杩愮畻绗︽槸>>.
銆銆鍙崇Щ瀵圭﹀彿浣岖殑澶勭悊鍜屽乏绉讳笉钖,瀵逛簬链夌﹀彿鏁存暟𨱒ヨ,姣斿俰nt绫诲瀷,鍙崇Щ浼氢缭鎸佺﹀彿浣崭笉鍙,渚嫔:
銆銆int i = 0x80000000;
銆銆i = i >> 1; //i镄勫间笉浼氩彉鎴0x40000000,钥屼细鍙樻垚0xc0000000
銆銆灏辨槸璇,绗﹀彿浣嶅悜鍙崇Щ锷ㄥ悗,姝f暟镄勮瘽琛0,璐熸暟琛1,涔熷氨鏄姹囩紪璇瑷涓镄勭畻链鍙崇Щ.钖屾牱褰撶Щ锷ㄧ殑浣嶆暟瓒呰繃绫诲瀷镄勯暱搴︽椂,浼氩彇浣欐暟,铹跺悗绉诲姩浣欐暟涓浣.
銆銆璐熸暟10100110 >>5(锅囱惧瓧闀夸负8浣)锛屽垯寰楀埌镄勬槸 11111101
銆銆镐讳箣,鍦–涓,宸︾Щ鏄阃昏緫/绠楁湳宸︾Щ(涓よ呭畬鍏ㄧ浉钖),鍙崇Щ鏄绠楁湳鍙崇Щ,浼氢缭鎸佺﹀彿浣崭笉鍙 .瀹为檯搴旂敤涓鍙浠ユ牴鎹𨱍呭喌鐢ㄥ乏/鍙崇Щ锅氩揩阃熺殑涔 /闄よ繍绠,杩欐牱浼氭瘆寰鐜鏁堢巼楂桦緢澶.
銆銆鍦ㄥ緢澶氱郴缁熺▼搴忎腑甯歌佹眰鍦ㄤ綅(bit)涓绾ц繘琛岃繍绠楁垨澶勭悊銆侰璇瑷鎻愪緵浜嗕綅杩愮畻镄勫姛鑳斤纴 杩欎娇寰桟璇瑷涔熻兘镀忔眹缂栬瑷涓镙风敤𨱒ョ紪鍐欑郴缁熺▼搴忋
銆銆铍佲挛铍佲挛铍佲挛铍佲挛铍佲挛铍佲挛铍佲挛铍佲挛铍佲挛铍佲挛铍佲挛铍佲挛铍佲挛铍佲挛
銆銆镎崭綔绗 浣灭敤
銆銆铍铍铍铍铍铍铍铍铍铍铍铍铍铍铍铍铍铍铍铍铍铍铍铍铍铍铍铍
銆銆& 浣嶉昏緫涓
銆銆| 浣嶉昏緫鎴
銆銆^ 浣嶉昏緫寮傛垨
銆銆- 浣嶉昏緫鍙
銆銆>> 鍙崇Щ
銆銆<< 宸︾Щ
銆銆铍佲挛铍佲挛铍佲挛铍佲挛铍佲挛铍佲挛铍佲挛铍佲挛铍佲挛铍佲挛铍佲挛铍佲挛铍佲挛铍佲挛
銆銆鎸変綅杩愮畻鏄瀵瑰瓧鑺傛垨瀛椾腑镄勫疄闄呬綅杩涜屾娴嬨佽剧疆鎴栫Щ浣, 瀹冨彧阃傜敤浜庡瓧绗﹀瀷鍜屾暣鏁板瀷鍙橀噺浠ュ强瀹冧滑镄勫彉浣, 瀵瑰叾瀹冩暟鎹绫诲瀷涓嶉傜敤銆
銆銆鎴戜滑瑕佹敞镒忓尯鍒嗕綅杩愮畻鍜岄昏緫杩愮畻銆
銆銆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浣嶃傚俛=00000011(鍗佽繘鍒3)锛屽乏绉4浣嶅悗涓00110000(鍗佽繘鍒48)銆
銆銆6. 鍙崇Щ杩愮畻
銆銆鍙崇Щ杩愮畻绗︹>>钬濇槸鍙岀洰杩愮畻绗︺傚叾锷熻兘鏄鎶娾>> 钬濆乏杈圭殑杩愮畻鏁扮殑钖勪簩杩涗綅鍏ㄩ儴鍙崇Щ鑻ュ共浣嶏纴钬>>钬濆彸杈圭殑鏁版寚瀹氱Щ锷ㄧ殑浣嶆暟銆备緥濡傦细璁 a=15锛宎>>2銆琛ㄧず鎶000001111鍙崇Щ涓00000011(鍗佽繘鍒3)銆傚簲璇ヨ存槑镄勬槸锛屽逛簬链夌﹀彿鏁帮纴鍦ㄥ彸绉绘椂锛岀﹀彿浣嶅皢闅忓悓绉诲姩銆傚綋涓烘f暟镞讹纴 链楂树綅琛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
銆銆镓浠ワ纴瀛楃︾被鍨媋镄勬渶楂树綅寮哄埗1鍙浠ヨ繖镙凤细a=a|0x80銆傚叾浠栫殑鍙浠ヤ緷娆$被鎺!
⑶ C语言中怎样表示移位啊例如将某个值左移两位
利用位操作:"<<"就是左移 ">>"就是右移
举个例子:将a左移2位,然后赋给a
a<<=2 也即是a=a<<2
在C语言中左移1位,相当于乘2,右移相当于除2。
⑷ 单片机 移位操作 右移 C语言
aa=_crol_(aa,1); //左移一位
aa=_cror_(aa,1); //右移一位
可以打开:intrins.h,查看。
⑸ C语言位运算符:与、或、异或、取反、左移和右移!
在C语言的世界里,位操作符犹如二进制运算的瑞士军刀,它们包括按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(<>),在处理二进制数据时展现出了强大的威力。</
按位与(&):</ 这个运算符如同一个精密的清零工具,通过与操作可以清零低字节或保留特定位。例如,60与17的按位与运算结果为00110000与00001111,得出00111111,这在数据处理中极具实用价值。
按位或(|):</ 它代表逻辑“或”操作,当二进制位中有一个为1时,结果为1。例如,60与17按位或运算后得到00110000或00001111,等于00111111,用于设置标志或组合多个位。
按位异或(^):</ 这个操作符用于实现数据的交换,无需临时变量。如a=3和b=4,通过a=a^b; b=b^a; a=a^b; 的序列操作,a最终变为4,b变为3,展示了异或的奇妙之处。
取反(~):</ 一元运算,它是整数二进制的反码操作,如~77的计算结果为01000000,这对于理解负数在计算机中的表示有着重要意义。
左移(<<):</ 通过左移位操作,我们可以将数值的位向左移动指定的位数,如15左移两位变为00111100,这在数据压缩和倍增操作中非常常见。
右移(>>):</ 无符号数右移时,高位自动补0;而对于有符号数,右移可能会影响到符号位(算术或逻辑移位)。例如,无符号数右移会导致溢出为0,这是理解数据类型特性的关键点。
移位的微妙差别:</ 左移时,根据移位方式(逻辑或算术)的区别,可能会产生不同的结果。例如,a = 113755 (二进制) 右移1,Turbo C系统得到045766,而其他系统可能得到145766,这体现了不同环境下的行为差异。
位运算的赋值妙用:</ 如a &= b等价于a = a & b,a <<= 2等同于a = a << 2,这些操作简化了代码,提高了效率。
深入探索:</ 拥有10年开发经验的老程序员分享,精心整理的C/C++学习资源与路线图,无论是初学者还是进阶者,都能从中找到适合自己的学习路径,加速成为编程高手的进程。