本文目錄一覽:
c語言里的按位或是怎麼算的?
有一個常識需求了解一下。整型數在內存中是以補碼形式表示的,如下式:
15 = 00001111
-9 = 11110111
—————————–
11111111 = (-1)
|是把15和-9兩個補碼按位作「或」運算,結果是一個全1的數(也是補碼形式),從補碼知識就知道這個數是-1
C語言中什麼是按位或運算
位運算是在二進制層面上進行的運算
位或就是在兩個二進制上進行按位的或運算
像普通的邏輯運算一樣 兩個里有一個為真就返回真(邏輯真 就是1 邏輯假就是0)
比如兩個十進制數 5 和 3 進行位或運算
把他們轉換為二進制
5的二進制是 0101
3的二進制是 0011
他們按位或的結果是0111 轉換到十進制就是0+4+2+1 是7
C語言中位運算是怎麼樣的?
就是對一個X進制數對應在內存中存放為二進制形式的數碼,進行二進制的位的操作後,得到原進制數值。
位操作有:與、或I、異^、左移、右移。
根據這些符號所代表的操作規則來計算一個數的二進制。
C語言 位運算
###位運算的邏輯:
1:(位與)運算符():雙目操作符,當兩個位進行相與時,只有兩者都為「1」時結果才為「1」(即:全真為真,一假為假),運算規則如下:
左運算量 右運算量 運算結果
0 0 = 0
0 1 = 0
1 0 = 0
1 1 = 1
運算:
例:
#include stdio.h
int main(int argc,char *crgv[]){
unsigned char x=0156, y=0xaf, z;
z=xy;
printf(“%d”,z)
}
結果為:0x2e
運算過程:0156(8進制)==0000 0110 1110(2進制);
進行 (位與運算)
0xaf(16進制) ==0000 1010 1111(2進制);
結果:0000 0010 1110(2進制)==0x2e(十六進制);
2:位或運算符(|):
雙目操作符,當兩個 位 進行相或時,兩者中只要有一方為「1」,結果就為「1」(即:一真為真,兩假為假),運算規則如下:
左運算量 右運算量 (|) 運算結果
0 | 0 = 0
1 | 1 = 1
0 | 1 = 1
1 | 1 = 1
例:
#include stdio.h
int main(int argv,char *argc[]){
unsigned char x=027,y=0x75;
z=x|y;
}
運行過程:
027(8進制)=0001 0111(2進制)
進行 |(位或運算)
0x75(16進制)=0111 0101(2進制)
結果:0111 0111(2進制)=0x77(16進制)
3.異或運算(^):
當兩個位進行異或時,只要兩者相同,結果為「0」,否者結果為「1」,(即:同假異真)運算規則如下:
左運算量 右運算量 (^) 運算結果
0 ^ 0 = 0
1 ^ 1 = 0
0 ^ 1 = 1
1 ^ 0 = 1
例:
#include
int main(int argv,char *argc[]){
unsigned(無符號) char x=25,y=0263,z;
z=x^y;
printf(“%d\n”,z);
}
運算過程:
25(十進制)=0001 1001(二進制)
運算 ^(異或運算)
0263(8進制)=1011 0011(二進制)
結果:1010 1010(二進制)=0252(8進制)
4:移位操作符(「」 或 “”):位移位運算的一般形式:運算量運算符表達式;
運算量必須為整型結果數值:
運算符為左移位()或 右移位()運算;
表達式也必須為整型結果數值;
移位操作就是把一個數值左移或右移若干位;假如左移n位,原來值最左邊的n位數被丟掉,右邊n衛補「0」 ;右移操作就是和左移操作移動方向相反;
符號位的處理方法:
(1):邏輯移位,不考慮符號問題,原數值右移n位後,左邊空出的n歌位置,用0填充;
(2):算術移位,原來值進行了右移操作後,需要保證符號位不變,因此,右移n位後,左邊空出的n個位置,用原數值的符號位填充。原來若是負數,則符號位為「1」,填充的位也是「1」;原來若是正數,則符號位為「0」,填充的位也是「0」,這樣保證移位後的數據與原數正負相同;
例:「1000 1001」將其右移兩位,邏輯移位的結果為「0010 0010」,算術移位為:「1110 0010」;
將其左移兩位,邏輯移位和算術移位的結果為:「0010 0100」;
(3)***補充:特定位清零(由「1」變成「0」)用 位與 操作;特定位變「1」(由「0」變成「1」)用 位或操作;
例:
a、請把0xd5的第2位進行清零操作
0xd5=1101 0101=1101 0001
1111 1011
~0000 0100
=0000 00012
~(0x012)0xd5
b、請把0xed的第3位進行清零操作
0xed=1110 1101=1110 0101
1111 0111
~
0000 1000
= 0000 00013
~(0x013)0xed
c、請把0x7d的第2-4位進行清零
0x7d=0111 1101=0110 0001
1110 0011
~
0001 1100
=
0000 01112
~(0x07)0x7d
d、請把0x7d的第2位和第3位進行清零
0x7d=0111 1101=0111 0001
1111 0011
~
0000 1100
0000 00112
~(0x032)0x7d
e、請把0xc7的第4位進行置1
0xc7=1100 0111=1101 0111
0001 0000
=0000 00014
=~(0x014)|0xc7
f、請把0x87的第3位進行置1
0x87=1000 0111=1000 1111
0000 1000
~(0x013)|0x87
g、請把0xc7的第3—5位置1
0xc7=1100 0111=1111 1111
0011 1000
0000 01113
~(0x073)|0x87
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/307280.html