C语言位运算

C语言提供的位运算:
运算符
含义
&
按位与
|
按位或

按位异或

取反
<<
左移
>>
右移
说明:
1。位运算符中除∽以外,均为二目(元)运算符,即要求两侧各有一个运算了量。
2、运算量只能是整形或字符型的数据,不能为实型数据。
“按位与”运算符(&)
规定如下:
0&0=0
0&1=0
1&0=0
1&1=1
例:3&5=?
先把3和5以补码表示,再进行按位与运算。
3的补码:
00000011
5的补码:
00000101
--------------------------------------------------------------------------------
&:
00000001
3&5=1
“按位或”运算符(|)
规定如下:
0|0=0
0&1=1
1&0=1
1&1=1
例:060|017=?
将八进制数60与八进制数17进行按位或运算。
060
00110000
017
00001111
--------------------------------------------------------------------------------
|:
00111111
060|017=077
“异或”运算符(∧),也称XOR运算符
规定如下:
0∧0=0
0∧1=1
1∧0=1
1∧1=0
例:57∧42=?
将十进制数57与十进制数42进行按位异或运算。
57
00111001
42
00101010
--------------------------------------------------------------------------------
∧:
00010011
57∧42=19
“取反”运算符(∽)
规定如下:
∽0=1
∽1=0
例:∽025=?
对八进制数25(即二进制0000000000010101)按位求反。
0000000000010101

1111111111101010
∽025=177752
左移运算符(<<)
 
将一个数的二进位全部左移若干位,若高位左移后溢出,则舍弃,不起作用。
例:a=a<<2
将a的二进制数左移2位,右补0。
若a=15,即二进制数00001111,则
a
00001111


a<<1
00011110


a<<2
00111100
最后a=60
右移运算符(>>)
 
将一个数的二进位全部右移若干位,低位移出部分舍弃。
例:a=a>>2
将a的二进制数右移2位,左补0。
若a=15,即二进制数00001111,则
a
00001111


a>>1
00000111


a>>2
00000011
最后a=3
位运算符与赋值运算符结合可以组成扩展的赋值运算符
如:&=,|=,>>=,<<=,∧=
例:a&=b相当于a=a&b
a<<=2相当于a=a<<2
不同长度的数据进行位运算
如果两个数据长度不同(例如long型和int型)进行位运算时(如a&b,而a为long型,b为int型),系统会将二者按右端对齐。如果b为正数,则左侧16位补满0。若b为负,左端应补满1。如果b为无符号整数型,则左端添满0。
位运算举例
例:取一个整数a从右端开始的4∽7位
考虑如下:1、先是a右移4位,即a>>4
2、设置一个低4位全为0的数,即∽(∽0<<4)
3、将上面两式进行与运算,即a>>4&∽(∽0<<4)
程序如下:
main()
{unsigned
a,b,c,d;
scanf("%o",&a);
b=a>>4;
c=∽(∽0<<4);
d=b&c;
printf("%o\n%o\n",a,b);
}
结果:331↙
331(a的值,八进制)
15
(d的值,八进制)
例:循环移位。要求将a进行右循环移位。即a右循环移n位,将a中原来左面(16-n)位右移n位。现假设两个字节存放一个整数。如右图。
考虑如下:1、先将a右端n位放到b中的高n位中,即:b=a<<(16-n)
2、将a右移n位,其左面高位n位补0,即c=a>>n
3、将c与b进行按位或运算,即c=c|b
程序如下:
main()
{unsigned
a,b,c;int
n:
scanf("a=%o,n=%d",&a,&n);
b=a<<(16-n);
c=a>>n;
c=c|b;
printf("%o\n%o",a,c);
}
结果:a=157653,n=3↙
331(a的值,八进制)
15
(d的值,八进制)
位段
所谓位段是以位为单位定义长度的结构体类型中的成员。
例:struct
packed-data
{unsigned
a:2;
unsigned
b:6;
unsigned
c:4;
unsigned
d:4;
int
i;
}data;

  • c璇█涓浣嶈繍绠鏈夐偅鍑犵?鍘熺悊鍒嗗埆鏄粈涔?
    绛旓細浣嶄笌銆佷綅鎴栥佸紓鎴栥佸彇鍙嶃佸乏绉汇佸彸绉荤瓑6绉嶏紝浣嶈繍绠瑕佹眰蹇呴』浣跨敤琛ョ爜褰㈠紡璁$畻銆備綅涓庯細瀵瑰簲鐨勪簩杩涘埗浣嶄笂鍙鍑虹幇1涓0锛屽垯褰撳墠浣嶄娇鐢ㄤ綅涓庡悗鐨勭粨鏋滀负0 浣嶆垨锛氬搴旂殑浜岃繘鍒朵綅涓婂彧瑕佸嚭鐜1涓1锛屽垯褰撳墠浣嶄娇鐢ㄤ綅涓庡悗鐨勭粨鏋滀负鍙︿竴涓簩杩涘埗浣嶇殑鍊 寮傛垨锛氬搴旂殑浜岃繘鍒朵綅鐩稿悓锛屽垯寮傛垨缁撴灉涓0锛屽惁鍒欏紓鎴栫粨鏋...
  • C璇█鐨勯昏緫杩愮畻鍜屾寜浣嶈繍绠鎬庝箞鍖哄垎?
    绛旓細1銆佷綔鐢ㄧ殑涓嶅悓 &&銆亅|鏄昏緫杩愮畻绗︼紝鐢ㄤ簬浠庡乏鍒板彸姹傝〃杈惧紡鐨勭湡鍊笺傚亣璁緓=1锛泍=2锛涢偅涔坸&&y=1锛泋||y=1銆&銆亅鏄浣嶈繍绠绗︼紝鏄x锛寉杩涜浣嶈繍绠楋紝x锛寉鍙栧煎涓婏紝閭d箞鏈墄&y=0锛涳紙x鐨勪簩杩涘埗琛ㄧず涓00锛寉鐨勪簩杩涘埗琛ㄧず涓10锛夈2銆佸垽鏂繖涓〃杈惧紡鐨勭湡鎴栧亣鐨勪笉鍚 &鍜寍鏃㈡槸閫昏緫杩愮畻绗︿篃鏄綅...
  • 鍦C璇█涓,&,涓,^鐨杩愮畻瑙勫垯鏄粈涔
    绛旓細1 & 0 = 0 1 & 1 = 1 2銆亅:浣嶆垨杩愮畻,閬1寰1锛屽嵆 0 | 0 = 0 0 | 1 = 1 1 | 0 = 1 1 | 1 = 1 3銆乛:寮傛垨杩愮畻锛屽湪鎴栫殑鍩虹涓1寮傛垨1寰0 0 ^ 0 = 0 1 ^ 0 = 1 0 ^ 1 = 1 1 ^ 1 = 0 //杩欐槸涓庢垨涓嶅悓鐨勫湴鏂广4銆佹敞鎰忥紝鍦C璇█涓紝浣嶈繍绠鍙兘鎿嶄綔...
  • C璇█涓殑浣嶈繍绠鏈変粈涔堜紭鐐?
    绛旓細浣嶈繍绠涓昏鏄洿鎺ユ搷鎺т簩杩涘埗鏃朵娇鐢 锛屼富瑕佺洰鐨勬槸鑺傜害鍐呭瓨锛屼娇浣犵殑绋嬪簭閫熷害鏇村揩锛岃繕鏈夊氨鏄鍐呭瓨瑕佹眰鑻涘埢鐨勫湴鏂逛娇鐢紝浠ヤ笅鏄竴鐗涗汉鎬荤粨鐨勬柟娉曪紝鍒嗕韩涓涓嬶細浣嶈繍绠楀簲鐢ㄥ彛璇 娓呴浂鍙栧弽瑕佺敤涓庯紝鏌愪綅缃竴鍙敤鎴 鑻ヨ鍙栧弽鍜屼氦鎹紝杞昏交鏉炬澗鐢ㄥ紓鎴 绉讳綅杩愮畻 瑕佺偣 1 瀹冧滑閮芥槸鍙岀洰杩愮畻绗︼紝涓や釜杩愮畻鍒嗛噺閮芥槸鏁村舰锛...
  • 涓轰粈涔C璇█鑳借繘琛屽浣(bit)鎿嶄綔? 瀵逛綅鎿嶄綔鏈変粈涔堟晥鏋?
    绛旓細褰撶劧鍙互瀵逛綅杩涜鎿嶄綔銆備竴鑸潵璇达紝鐢浣嶈繍绠灏辨槸瀵逛綅鎿嶄綔銆備綅杩愮畻鍖呮嫭 ^ 寮傛垨 | 浣嶆垨 & 浣嶄笌 ~ 浣嶆眰鍙 >> 鍙崇Щ浣 << 宸︾Щ浣 瀵逛綅鎿嶄綔鐨勫ソ澶勬槸蹇紝骞朵笖鍩烘湰涓婂拰姹囩紪涓涓瀵瑰簲锛屽彲浠ョ洿鎺ョ畻鍑鸿繍绠楁椂闂达紝璁$畻閫熷害銆傚緢澶氳琛ㄨ揪纭欢璁$畻锛屾垨鑰呮彁楂樿繍绠楅熷害鐨勬椂鍊欙紝閮戒細鐩存帴鐢ㄤ綅杩愮畻銆傛瘮濡備箻16锛屼綅杩愮畻灏...
  • C璇█闂,鍦浣嶈繍绠涓,鎿嶄綔鏁版瘡鍙崇Щ涓浣,鍏剁粨鏋滅浉褰撲簬浠涔?鑻ュ乏绉1浣...
    绛旓細鍙崇Щ瀵圭鍙蜂綅鐨勫鐞嗗拰宸︾Щ涓嶅悓锛屽浜庢湁绗﹀彿鏁存暟鏉ヨ锛屾瘮濡俰nt绫诲瀷锛屽彸绉讳細淇濇寔绗﹀彿浣嶄笉鍙橈紝渚嬪锛歩nti=0x80000000锛沬=i>>1锛//i鐨勫间笉浼氬彉鎴0x40000000锛岃屼細鍙樻垚0xc0000000 2銆佸乏绉伙紝涔樹互2宸︾Щn浣嶄箻浠2鐨刵娆℃柟锛涘厛璇村乏绉伙紝宸︾Щ灏辨槸鎶婁竴涓暟鐨勬墍鏈変綅閮藉悜宸︾Щ鍔ㄨ嫢骞蹭綅锛屽湪C涓敤<<杩愮畻绗︺
  • C璇█涓寜浣嶄笌(&)杩愮畻绗︽槸浠涔堟剰鎬?
    绛旓細浣嶈繍绠绗﹀氨鏄洿鎺ュ鏁存暟鍦ㄥ唴瀛樹腑鐨勪簩杩涘埗浣嶈繘琛屾搷浣滆繍绠椼傛瘮濡傦紝&&杩愮畻鏈潵鏄竴涓昏緫杩愮畻绗︼紝浣嗘暣鏁颁笌鏁存暟涔嬮棿鍙互鐢&杩涜杩愮畻銆備妇涓緥瀛愶紝6鐨勪簩杩涘埗鏄110锛11鐨勪簩杩涘埗鏄1011锛岄偅涔6 & 11鐨勭粨鏋滃氨鏄2锛屽畠鏄簩杩涘埗瀵瑰簲浣嶈繘琛岄昏緫杩愮畻鐨勭粨鏋滐紙0琛ㄧずFalse锛1琛ㄧずTrue锛岀┖浣嶉兘褰0澶勭悊锛夈C璇█鎻愪緵浜嗗叚...
  • c璇█浣嶈繍绠闂?
    绛旓細c璇█浣嶈繍绠闂瑙g瓟锛氳瑙g瓟杩欎釜闂鎴戜滑鍏堟潵鐪嬩竴涓緥瀛愶紝浠g爜濡備笅鍥句竴锛屽浘涓彸杈规槸闂涓緱鍒颁唬鐮侊紝宸﹁竟鏄繖娈典唬鐮佺殑姹囩紪鎸囦护銆備袱绉嶆儏鍐电殑涓嶅悓鐐硅缁嗚鏄庡涓嬶細绗竴绉嶆儏鍐碉細printf("%d",2>>64);鐢卞浘涓殑姹囩紪浠g爜鍙互鐪嬪嚭锛屽鏋滀袱涓暟閮芥槸甯告暟鐨勬儏鍐典笅锛屼唬鐮佷腑鏄笉鍚搴旂殑姹囩紪鎸囦护鐨勶紝鍥犱负缂栬瘧鍣...
  • c璇█涓殑浣嶈繍绠涓0x0f鍜0x0f鈥濇槸浠涔堟剰鎬
    绛旓細0X涓C璇█涓崄鍏繘鍒惰浆鍖栦负浜岃繘鍒剁殑鍓嶇紑琛ㄧず鏂规硶锛岀湅鍚庨潰鐨勪袱浣嶅搴旂殑鏁板瓧銆0x0f锛堝崄鍏繘鍒讹級琛ㄧず00001111锛堜簩杩涘埗锛夋垨15锛堝崄杩涘埗锛夈侰璇█鏄竴闂ㄩ潰鍚戣繃绋嬨佹娊璞″寲鐨勯氱敤绋嬪簭璁捐璇█锛屽箍娉涘簲鐢ㄤ簬搴曞眰寮鍙戙侰璇█鑳戒互绠鏄撶殑鏂瑰紡缂栬瘧銆佸鐞嗕綆绾у瓨鍌ㄥ櫒銆侰璇█鏄粎浜х敓灏戦噺鐨勬満鍣ㄨ瑷浠ュ強涓嶉渶瑕佷换浣曡繍琛岀幆澧...
  • 浣嶈繍绠绗︾殑C璇█鐨勫叚绉嶄綅杩愮畻绗
    绛旓細渚嬪鎶奱 鐨勯珮鍏綅娓 0 , 淇濈暀浣庡叓浣, 鍙綔 a&255 杩愮畻 ( 255 鐨勪簩杩涘埗鏁颁负11111111)銆 main(){ inta=9,b=5,c; c=a&b; printf(a=%d\nb=%d\nc=%d\n,a,b,c);} 鎸変綅鎴栬繍绠楃鈥渱鈥濇槸鍙岀洰杩愮畻绗︺ 鍏跺姛鑳芥槸鍙備笌杩愮畻鐨勪袱鏁板悇瀵瑰簲鐨勪簩杩涗綅鐩告垨銆傚彧瑕佸搴旂殑浜屼釜浜岃繘浣嶆湁涓涓负1鏃,缁撴灉浣嶅氨...
  • 本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网