c語言位或運算
❶ c語言里的按位或是怎麼算的
有一個常識需求了解一下。整型數在內存中是以補碼形式表示的,如下式:
15 = 00001111
-9 = 11110111
-----------------------------
11111111 = (-1)
|是把15和-9兩個補碼按位作「或」運算,結果是一個全1的數(也是補碼形式),從補碼知識就知道這個數是-1
❷ C語言…按位與,按位或!
是按2進制代碼的同位進行運算。例如1010和1101這2個2進制數:
按位與為:
1010
1101
=
1000對應為同為1時是1,否則為0.
按位或為:
1010
1101
=
1111隻要同位的兩個全為零時得零,否則為1
❸ C語言中什麼是按位或運算
位運算是在二進制層面上進行的運算
位或就是在兩個二進制上進行按位的或運算
像普通的邏輯運算一樣 兩個里有一個為真就返回真(邏輯真 就是1 邏輯假就是0)
比如兩個十進制數 5 和 3 進行位或運算
把他們轉換為二進制
5的二進制是 0101
3的二進制是 0011
他們按位或的結果是0111 轉換到十進制就是0+4+2+1 是7
❹ C語言中按位或,與,非是怎麼用的,怎麼運算
位運算符
C提供了六種位運算運算符;這些運算符可能只允許整型操作數,即char、short、int和long,無論signed或者unsigned。
&
按位AND
|
按位OR
^
按位異或
<<
左移
>>
右移
~
求反(一元運算)
按位與操作&通常用於掩去某些位,比如
n
=
n
&
0177;
使得n中除了低7位的各位為0。
按位或操作|用於打開某些位:
x
=
x
|
SET_ON;
使得x的某些SET_ON與相對的位變為1。
按位異或操作^使得當兩個操作數的某位不一樣時置該位為1,相同時置0。
應該區分位操作符&、|與邏輯操作符&&、||,後者從左到右的評價一個真值。比如,如果x為1、y為2,那麼x
&
y為0,而x
&&
y為1。
移位運算符<<和>>將左側的操作數左移或者右移右操作數給定的數目,右操作數必須非負。因此x
<<
2將x的值向左移動兩位,用0填充空位;這相當於乘4。右移一個無符號數會用0進行填充。右移一個帶符號數在某些機器上會用符號位進行填充(「算數移位」)而在其他機器上會用0進行填充(「邏輯移位」)。
單目運算符~對一個整數求反;即將每一個1的位變為0,或者相反。比如
x
=
x
&
~077
將x的後六位置0。注意x
&
~077的值取決於字長,因此比如如果假設x是16位數那麼就是x
&
0177700。這種簡易型式並不會造成額外開銷,因為~077是一個常數表達式,可以在編譯階段被計算。
作為一個使用位操作的實例,考慮函數getbits(x,p,n)。它返回以p位置開始的n位x值。我們假設0位在最右邊,n和p是正數。例如,getbits(x,4,3)返回右面的4、3、2位。
/*
getbits:
返回從位置p開始的n位
*/
unsigned
getbits(unsigned
x,
int
p,
int
n)
{
return
(x
>>
(p+1-n))
&
~(~0
<<
n);
}
表達式x
>>
(p+1-n)將需要的域移動到字的右側。~0是全1;將其左移n為並在最右側填入0;用~使得最右側n個1成為掩碼。
❺ c語言中按位與按位或是什麼意思
按位運算符「&」是雙目運算符。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位都為1時,結果位才為1。參與運算的兩個數均以補碼出現。
按位或運算符「|」是雙目運算符。其功能是參與運算的兩數各對應的二進位相或。只要對應的二個二進位有一個為1時,結果位就為1。當參與運算的是負數時,參與兩個數均以補碼出現。
整數在計算機中用二進制的位來表示,C語言提供一些運算符可以直接操作整數中的位,稱為位運算,這些運算符的操作數都必須是整型的。
按位與運算按位與運算符「&」是雙目運算符。其褲槐功歲隱能是參與運算的兩胡雀友數各對應的二進位相與。只要對應的二個二進位都為1時,結果位就為1。參與運算的兩個數均以補碼出現。例如:3&10可寫算式如下:00000011&0000101000000010十進制2。
❻ C語言的a|b是什麼意思什麼是按位或
a|b這個就是按位或
按位或是位運算的一種,是將兩個數據的二進製表示右對齊後,按位進行運算,兩個對應的敗讓二進制位中只要一個是1,結果對應位就是1
1|1=0,1|0=1,0|1=1,0|0=0
比如說十進制數2和1
2|1
先把它們換成二進製表示
10,01
按照剛才的規則:
10
|
01
--------
11
結果是二察悔局進制的11,也前空就是十進制的5
❼ c語言位運算
這個很簡單,你打開電腦的計算器,將521輸入,然後用二進制顯示,你看到的是:1000001001,
123是:1111011;與123 按位與的結果就是0000 1001;用十進制顯示的時候就是9,其他的計算也是這樣算出來的,你試下就知道了,在此我就不一一舉例了。
&:這是與操作,只有1&1才能是1
|:這是或操作,有一個是1結果就是1
~:取反操作,
❽ 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語言中按位或,與,非是怎麼用的,怎麼運算
C語言中按位或,與,非是怎麼用的,怎麼運算? 按位或規則:
1|1=1
1|0=1
0|1=1
0|0=0
按位與規則:
1&1=1
1&0=0
0&1=0
0&0=0
非運算規則:
~1=0
~0=1
對每一個二進位制位進行相應的運算。
c語言中>>=運運算元是怎麼用的?能舉例最好
首先,">>"是一個運運算元,叫做右移運運算元,與之對應的有"<<"左移運運算元。
其次,">>="或是"<<="與"+=","-=","*=","/="等等這些運運算元作用是相同的。
通常可以使用位移運運算元做快速的"*2"或"/2"運算
比如:
int a=32;
printf("%d",(a>>=3));
右移3位,就相當於32/2/2/2=4
如果改為左移,
int a=16;
printf("%d",(a<<=2));
左移2位,就相當於16*2*2=64
在C語言中指數運算怎麼用
C語言中指標運算要用pow()函式,例如2的4次方要寫成這樣:pow(2,4);^在C語言中是一個位操作符,作用是按位異或。注意,pow()函式要包譽判罩含math.h檔案
c語言中for語句是怎麼用的
for是C語言中的一個關鍵字,主要用來控制迴圈語句的執行。下面舉例說明for語句的使用方法:int i;for(i=0; i i=0是初始化部分;i{printf("HelloWorld");} 上面的for語句就是控制輸出3次HelloWorld
for迴圈是開界的。它的一般形式為: for(; ; ) 語句; 初始化總是一個賦值語句, 它用來給迴圈控制變數賦初值; 條件表示式是一個關系表示式,慶鬧 它決定什麼時候退出迴圈; 增量定義迴圈控制變數每迴圈一次後 按什麼方式變化。這三個部分之間用";"分開。 例如: for(i=1; i10時, 結束迴圈。
for的迴圈順序你如果了解的話就會理解i++的作用了 我系統的說下吧 for(表示式1;表示式2;表示式3){ 迴圈內容; } for的流程如下 當進入for迴圈的時候,首先執行表示式1(就是你上邊的i=1的部分) 然後執行表示式2(就是你上邊的i<8的部分)判斷是否滿足條件 滿足條件進入迴圈體,執行迴圈體內容,當迴圈結束後執行表示式3(也就是你寫的i++),然後再執行表示式2,判斷是否還滿足條件,這時i經過了表示式3後值已經變成了2.所以還是滿足表示式2的條件。這樣一直下去直到不滿足的時候迴圈就結束了
迴圈如for (i=o;i<5;i++)printf("\n"); i初始值為0.i小於5時執行以下的語句。執行後就進行i++(也就是把i自身+1)。
for()迴圈,最常用的迴圈
語法結構:
for(語句1;語句2;語句3){
迴圈體
}
語句1:初值表示式,用於在迴圈開始前為迴圈變數賦初值
語句2:迴圈控制邏輯表示式,它控制迴圈執行的條件,決定迴圈的次數
語句3:迴圈控制變數修改表示式,它使for迴圈趨向結束
迴圈體:需要重復執行的語句
常式:
#include<stdio.h>
int main(){
for(int i=0;i<5;i++){
printf("%d\n",i);
}
return 0;
}
語句1: int i=0;
(僅進入迴圈體時執行,同一個迴圈周期僅執行一次)
語句2:i<10; 判斷語句,當條件成立時執行迴圈體
(當程式進入迴圈時,i=0,此時緊接著執行語句2,發現語句2成立,那麼程式開始執行迴圈體)
語句3:i++;
(第一次迴圈體執行完成後,程式自動執行語句3,執行語句3後自動再去判斷語句2是否成立,如果成立則再執行迴圈體,以此類推)
迴圈體:printf(「%d\n」,i);
程式解釋:迴圈輸出變數i的值
最終輸出結果
0
1
2
3
4
「」這是注釋符,注釋符後面的內容是對程式的解釋或者說明,不是程式體的一部分 如果有大沖手塊資料作為引數傳遞的時候,採用的方案往往是指標,
for(int i=0; i<10; ++i){ printf("你好"); 輸出你好10次}
在C語言中,運運算元 是什麼意思是怎麼用的
運運算元就是執行運算的符號。
和數學裡面的加減乘除類似用法。
比如A+B 這里的+ 就是運運算元。
分為單目 雙目 三目三種。
^的意思是異或,就是二進位制的按位計算,相異為1,否則為0;
舉個例子:
140^60 = (0x10001100) ^ (0x00111100) = 0x10110000 = 176
C語言中逗號運運算元怎麼用?
逗號運運算元( , )是C語言運運算元中優先順序最低的一種運運算元,結合順序是從左至右,用來順序求值(最後一個逗號後面表示式的值作為整個表示式的值)。
根據你的例子,首先聲明了三個變數a,s,d;接著給s賦值為2,d賦值為3;接著要計算給a賦的值:根據運運算元的優先順序,先算小括弧里的s+2=4,接著算d+4=7,然後才是逗號運運算元,取7,最後和小括弧外面的12想加得19,即a=19。
❿ c語言中按位或|
這里涉及到的是位操作。
首先你需要了解內存中的數字存儲形式(二進制)。這里的a是一個標識符,用於存儲標記。具體而言,a是一個八個比特長的變數。比如0b00000000,0b00001110等等。用十六進制可以簡寫為0x00, 0x0E等等(這里兩個例子沒有任何含義)
在C語言中「<<」表示移位操作,比如0b00000001左移3位,就會變成0b00001000;左移2位就是0b00000100;等等。
然後你這里沒有給出digitalRead()函數的返回類型,我認為是0或1。在這種情況下,0寫成8位二進制是0b00000000,左移任何位都是0,如果是1的話,左移x位表示把從右往左數第x+1位變成1,比如:1<<3表示0b00001000,從右至左第4位變成1。
接下來,你有4個digitalRead函數,但是你想同時關心4個返回值。怎麼辦呢?我把第x個返回值放在從右往左數第x位上。比如0b00000110,表示第二、三個返回值是1,剩下兩個返回值是0。那麼你按上面的移位操作,可以得到這樣4個數:
0b 0000 0000 (返回值是0)
0b 0000 0100 (返回值是1)
0b 0000 0010 (返回值是1)
0b 0000 0000 (返回值是0)
按位進行「或」操作。「或」操作你肯定明白,有1就是1,沒1才是0
所以根據結果可以知道4個返回值是怎麼樣的。於是在switch語句中的返回值表明,如果是0x00(表示4個返回值是0),或是0x0F(4個返回值都是1)(F是4個1),則進行某種操作。
不知道明白了沒?