c语言的按位运算符怎么操作!? c语言之中的位运算符是怎么运算的呢?

C\u8bed\u8a00\u4e2d\u7684\u6309\u4f4d\u8fd0\u7b97\u7b26\u548c\u903b\u8f91\u8fd0\u7b97\u7b26\uff1f

&&\u662f\u903b\u8f91\u4e0e\uff0c\u8ba1\u7b97\u673a\u7684\u903b\u8f91\u65e0\u975e\u4e24\u79cd\uff0c0\u548c\u975e0\uff0c7\u548c8\u90fd\u662f\u975e0\uff0c\u90a3\u4e487&&8\u5c31\u662f\u975e0\uff0c\u4e5f\u5c31\u662f\u771f\u4e86\u3002
&\u662f\u4f4d\u64cd\u4f5c\uff0c\u5373\u6309\u4e24\u4e2a\u64cd\u4f5c\u6570\u7684\u4e8c\u8fdb\u5236\u6bcf\u4e00\u4f4d\u8fdb\u884c\u4e0e\u8fd0\u7b97
7\u7684\u4e8c\u8fdb\u5236\uff1a00000111
8\u7684\u4e8c\u8fdb\u5236\uff1a00001000
\u4e0e\u8fd0\u7b97\u540e\u4e3a:00000000\uff0c\u7ed3\u679c\u5c31\u662f\u5047\u4e86

\u6240\u8c13\u4f4d\uff0c\u5c31\u662f\u6307\u5c06\u4e00\u4e2a\u6216\u4e24\u4e2a\u6570\u8f6c\u6362\u6210\u4e8c\u8fdb\u5236\u6309\u6bcf\u4e00\u4f4d\u8fdb\u884c\u8fd0\u7b97

&\u4f4d\u4e0e
\u8fd0\u7b97\u89c4\u5219
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

|\u4f4d\u6216
\u8fd0\u7b97\u89c4\u5219
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1

^\u5f02\u6216
\u8fd0\u7b97\u89c4\u5219
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

~\u53d6\u53cd
\u8fd0\u7b97\u89c4\u5219
\u5c060\u53d81
\u5c061\u53d80

<<\u5de6\u79fb
\u8fd0\u7b97\u89c4\u5219
\u5de6\u79fbn\u4f4d\uff0c\u76f8\u5f53\u4e8e\u7ed9\u4e00\u4e2a\u5341\u8fdb\u5236\u6570\u4e58\u4ee52\u7684n\u6b21\u65b9

>>\u53f3\u79fb
\u8fd0\u7b97\u89c4\u5219
\u53f3\u79fbn\u4f4d\uff0c\u76f8\u5f53\u4e8e\u7ed9\u4e00\u4e2a\u5341\u8fdb\u5236\u6570\u9664\u4ee52\u7684n\u6b21\u65b9

\u524d\u4e09\u4e2a\u662f\u4e24\u4e2a\u4e8c\u8fdb\u5236\u6570\u4e4b\u95f4\u7684\u8fd0\u7b97
\u540e\u4e09\u4e2a\u662f\u4e00\u4e2a\u4e8c\u8fdb\u5236\u6570\u81ea\u8eab\u7684\u8fd0\u7b97

位运算

在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能, 这使得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\nb=%d\nc=%d\n",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\nb=%d\nc=%d\n",a,b,c);
}

3. 按位异或运算 按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如9^5可写成算式如下: 00001001^00000101 00001100 (十进制为12)
main(){
int a=9;
a=a^15;
printf("a=%d\n",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 取决于编译系统的规定。Turbo C和很多系统规定为补1。
main(){
unsigned a,b;
printf("input a number: ");
scanf("%d",&a);
b=a>>5;
b=b&15;
printf("a=%d\tb=%d\n",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\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
}

简单说,c编程的时候输入的都是十进制数字,但如果你要对二进制数字进行运算,就要用这种按位运算的符号。此前编译程序先要把十进制变成二进制,比如int x=67的二进制是这样的。
67->00000000 00000000 00000000 00100011
比如:
&:有0则结果为0。 1&1=1, 其余组合为0
比如67&1=1
|:有1则结果为1。 0|0=0, 其余组合为1
比如67|1=67
^:异或。相反则为1
比如67^1=66
~取反: 1变0,0变1
比如67取反就变成了
11111111 11111111 11111111 11011100
也就是-66
>>:右移: 上面的就变成了00000000 00000000 00000000 00010001,也即33
<<:左移:上面的就变成了00000000 00000000 00000000 01000110,也即134

&按位与,|按位或,^按位异或,-求补,>>左移,<<右移.

与&一般用来将某数的某些位置零.

设二进制是1101001的数,如果要将第四位置0,就拿它与11101111进行与

或|一般用来将两个数合成,

比如00110011与11000000或的结果11110011

异或^用来将某数的某些位取反

比如00011100将第三四位取反,就将它与00110000进行异或

>>左移,算术运算中是将某数除二,逻辑中是移位
<<右移,算术运算中是将某数乘二,逻辑中是移位

0001100逻辑左移2位0110000,
1111100算术右移2位11111111,相当于除四

-求补,求一个数的相反数

http://topic.csdn.net/t/20020513/19/719102.html

  • C璇█涓寜浣涓(&)杩愮畻绗鏄粈涔堟剰鎬
    绛旓細鏄皢浜岃繘鍒舵暟鎸夌収浣鐨勫搴旂浉涓庯紝寰楀埌涓涓柊鐨勪簩杩涘埗鏁般1涓0涓0锛1涓1涓1锛0涓0涓0銆傚垎鏋愬涓嬶細灏辨槸浜岃繘鍒剁殑姣忎竴浣嶇浉涓庛傛瘮濡傦細1010 0011& 0000 1111锛岀粨鏋滀负0000 0011銆備篃灏辨槸涓庝笂0鐩稿綋浜庢妸閭d綅鏁版竻0锛屼笌涓1鐩稿綋浜庢妸閭d綅淇濈暀銆
  • C璇█閲鐨勬寜浣寮傛垨杩愮畻绗
    绛旓細鎸変綅寮傛垨锛屽叾鎿嶄綔绗涓篰锛屽舰寮忎负a^b璁$畻鏃讹紝鏍规嵁鎿嶄綔鏁癮鍜宐姣忎綅鐨勫硷紝璁$畻缁撴灉锛屽綋a,b鐨勫搴斾綅涓婂肩浉鍚屾椂锛岀粨鏋滅殑璇ヤ綅涓婂间负0锛屽惁鍒欏间负1銆傚char a = 0x12, b = 0x34;a^b= 0x12 ^ 0x34= B0001 0010 ^ B0011 0100= B0010 0110=0x26 ...
  • c璇█,浣嶇鍚堣祴鍊杩愮畻瀛, =,&=,^=!=, 鍒嗗埆浠涔堝惈涔夊晩?
    绛旓細8.>>= 鍙崇Щ鍚庤祴鍊 鍙樻暟>>=琛ㄧず寮 鍙崇Щ杩愮畻瀛愭槸鐢ㄦ潵灏嗕竴涓暟鐨勫悇浜岃繘浣嶅埗浣嶅彸绉昏嫢骞蹭綅,绉诲姩鐨勪綅鏁扮敱鍙宠繍绠楀厓鎸囧畾(鍙宠繍绠楀厓蹇呴』鏄潪璐熷),绉诲埌鍙崇鐨勪綆浣嶈鑸嶅純,瀵逛簬鏃犵鍙锋暟,楂樹綅琛0銆傚浜庢湁绗﹀彿鏁,鏌愪簺鏈哄櫒灏嗗宸﹁竟绌哄嚭鐨勯儴鍒嗙敤绗﹀彿浣嶅~琛(鍗斥滅畻鏈Щ浣嶁),鑰屽彟涓浜涙満鍣ㄥ垯瀵瑰乏杈圭┖鍑虹殑閮ㄥ垎鐢0濉ˉ(鍗...
  • C璇█涓殑鎸変綅杩愮畻绗鍜岄昏緫杩愮畻绗?
    绛旓細&&鏄昏緫涓庯紝璁$畻鏈虹殑閫昏緫鏃犻潪涓ょ锛0鍜岄潪0锛7鍜8閮芥槸闈0锛岄偅涔7&&8灏辨槸闈0锛屼篃灏辨槸鐪熶簡銆&鏄浣嶆搷浣锛屽嵆鎸変袱涓搷浣滄暟鐨勪簩杩涘埗姣忎竴浣嶈繘琛屼笌杩愮畻 7鐨勪簩杩涘埗锛00000111 8鐨勪簩杩涘埗锛00001000 涓庤繍绠楀悗涓:00000000锛岀粨鏋滃氨鏄亣浜
  • 鍒濆C璇█杩愮畻绗涓鎿嶄綔绗鐨勭敤娉 鏈2涓枒闂?
    绛旓細浠庨鏉ョ湅浣犵殑鐞嗚В鏄鐨勶紝璁茶В鏈夎銆傚湪C璇█涓濡傛灉闇瑕佷繚鐣欏摢鍑犱釜浣嶏紝灏卞拰鍙湁閭e嚑浣嶆槸1鍏跺畠浣嶄负0鐨勬暟杩涜鎸変綅涓鎿嶄綔銆傚儚棰樹腑濡傛灉鍙橀噺鏄8浣嶇殑淇濈暀楂4浣嶄篃鍙互鎸夊涓嬫搷浣滐紝鍏堝悜鍙崇Щ4浣嶏紝鐒跺悗鍚戝乏绉诲洓浣嶏細鍗 char x = 'A';x = (x>>4) << 4;杩欐牱鏈変釜濂藉灏辨槸涓嶉渶瑕佺畻...
  • C璇█浣嶆搷浣滆繍绠楃 &,|,~,^,<<,>>鏄共浠涔鐨?
    绛旓細褰撶劧鏄鎿嶄綔浣浜 浠讳綍鏁版嵁閮芥槸浠ヤ簩杩涘埗褰㈠紡瀛樺偍鐨 浣嶆搷浣滆繍绠楃灏辨槸鐩存帴瀵逛簩杩涘埗杩涜鎿嶄綔
  • C璇█涓!鏄粈涔杩愮畻绗?鎬庝箞浣跨敤鐨?
    绛旓細閫昏緫闈 璁$畻鏈轰腑閫昏緫杩愮畻缁撴灉鍙湁0鍜1涓や腑 浣滈昏緫杩愮畻闈炴槸涓嶆槸闆剁殑鏁伴兘鍙互鐪嬪仛鏄1 锛0=1 锛1=0 渚嬪瓙灏辨槸涔︿笂鐨!3=0锛岃繖閲岀浉褰撲簬鎶3"褰撴垚1"
  • c璇█涓(鎰熷徆鍙!)鏄粈涔堟剰鎬?
    绛旓細锛佽〃绀洪昏緫闈烇紝鏄昏緫杩愮畻绗︼紝杩愮畻瀵硅薄鏄湡鎴栧亣銆傝嫢琛ㄧずa涓嶇瓑浜0锛屽氨鍐欐垚a!=0锛涘亣璁綼绛変簬1锛岄偅a!=0锛涘氨鏄湡鐨勶紝true銆C璇█涓殑绗﹀彿鍒嗕负10绫伙細绠楁湳杩愮畻绗︺佸叧绯昏繍绠楃銆侀昏緫杩愮畻绗︺浣嶆搷浣滆繍绠楃銆佽祴鍊艰繍绠楃銆佹潯浠惰繍绠楃銆侀楀彿杩愮畻绗︺佹寚閽堣繍绠楃銆佹眰瀛楄妭鏁拌繍绠楃鍜岀壒娈婅繍绠楃銆傚叾涓昏緫杩愮畻绗...
  • c璇█涓殑浣嶈繍绠楃涓鎸変綅鍙栧弽鈥欐槸鎬庝箞杩愮畻鐨
    绛旓細浣跨敤~鎸変綅鍙栧弽杩愮畻鐨勬椂鍊欙紝璁$畻鏈轰細灏鎿嶄綔鏁版墍瀵瑰簲鐨勪簩杩涘埗琛ㄨ揪寮忕殑姣忎竴涓綅杩涜鍙栧弽璁$畻锛屽彇鍙嶅悗鎵寰楀埌鐨勫煎氨鏄瘇鎸変綅鍙栧弽鐨勮繍绠缁撴灉銆備緥濡傦紝鍋囧璁$畻鏈烘槸32浣嶇殑锛屾帴涓嬫潵瑕佽绠梸5鐨勫硷紝璁$畻杩囩▼濡備笅锛5 鐨勪簩杩涘埗琛ㄨ揪寮忎负锛0000 0000 0000 0000 0000 0000 0000 0101 鎵ц~杩愮畻锛屽嵆~5鍚: 1111 ...
  • C璇█鐨閫昏緫杩愮畻鍜鎸変綅杩愮畻鎬庝箞鍖哄垎?
    绛旓細1銆佷綔鐢ㄧ殑涓嶅悓 &&銆亅|鏄昏緫杩愮畻绗︼紝鐢ㄤ簬浠庡乏鍒板彸姹傝〃杈惧紡鐨勭湡鍊笺傚亣璁緓=1锛泍=2锛涢偅涔坸&&y=1锛泋||y=1銆&銆亅鏄浣嶈繍绠楃锛屾槸瀵箈锛寉杩涜浣嶈繍绠楋紝x锛寉鍙栧煎涓婏紝閭d箞鏈墄&y=0锛涳紙x鐨勪簩杩涘埗琛ㄧず涓00锛寉鐨勪簩杩涘埗琛ㄧず涓10锛夈2銆佸垽鏂繖涓〃杈惧紡鐨勭湡鎴栧亣鐨勪笉鍚 &鍜寍鏃㈡槸閫昏緫杩愮畻绗︿篃鏄綅...
  • 扩展阅读:c#加减乘除 ... c语言中所有符号大全 ... c++运算符大全 ... &表示什么 ... c语言必背100代码 ... c#表达式计算 ... c语言位运算符取反 ... c语言转化成流程图 ... c语言位运算符详解 ...

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