C語言中移位運算子有什麼用嗎怎麼感覺可以單純用乘法除法代替呢

2021-04-21 09:41:18 字數 5249 閱讀 8819

1樓:愛你不乖

在計算機中所有資料儲存為二進位制,每一位即2的次方形式,移位相當於只是去掉末尾或增加一位再讀取資料,相比加減乘除運算步驟則大減少

2樓:匿名使用者

在微控制器或者嵌入式系統中 移位可以提高很多執行效率。

c語言中的位運算有什麼優點?

3樓:匿名使用者

很多高階的動態規劃題目或者一些基礎的運算往往需要較高的執行效率和較低的空間需求,或者需要表示一些狀態集合,而位運算剛好能滿足這一切。很多的時候,恰當的位運算使用也能使程式變得更加簡潔和優美。

c語言中位移位運算子? 100

4樓:匿名使用者

位移運算子

符號 描述

<< 左移

>> 右移

位移運算子作用於其左側的變數,其右側的表示式的值就是移動的位數,運算結果就是移動後的變數結果。

b=a<<2;

就是a的值左移兩位並賦值為b。a本身的值並沒有改變。

向左移位就是在低位補0,向右移位就是在高位上補0。右移時可以保持結果的符號位,也就是右移時,如果最高位為1,是符號位,則補1而不是補0。

程式設計師常常對右移運算子來實現整數除法運算,對左移運算子來實現整數乘法運算。其中用來實現乘法和除法的因子必須是2的冪次。

5樓:匿名使用者

一、賦值運算子

賦值語句的作用是把某個常量或變數或表示式的值賦值給另一個變數。符號為『=』。這裡並不是等於的意思,只是賦值,等於用『==』表示。

注意:賦值語句左邊的變數在程式的其他地方必須要宣告。

得已賦值的變數我們稱為左值,因為它們出現在賦值語句的左邊;產生值的表示式我們稱為右值,因為她它們出現在賦值語句的右邊。常數只能作為右值。

例如:count=5;

total1=total2=0;

第一個賦值語句大家都能理解。

第二個賦值語句的意思是把0同時賦值給兩個變數。這是因為賦值語句是從右向左運算的,也就是說從右端開始計算。這樣它先total2=0;然後total1=total2;那麼我們這樣行不行呢?

(total1=total2)=0;

這樣是不可以的,因為先要算括號裡面的,這時total1=total2是一個表示式,而賦值語句的左邊是不允許表示式存在的。

二、算術運算子

在c語言中有兩個單目和五個雙目運算子。

符號 功能

+ 單目正

- 單目負

* 乘法

/ 除法

% 取模

+ 加法

- 減法

下面是一些賦值語句的例子, 在賦值運算子右側的表示式中就使用了上面的算術運算子:

area=height*width;

num=num1+num2/num3-num4;

運算子也有個運算順序問題,先算乘除再算加減。單目正和單目負最先運算。

取模運算子(%)用於計算兩個整數相除所得的餘數。例如:

a=7%4;

最終a的結果是3,因為7%4的餘數是3。

那麼有人要問了,我要想求它們的商怎麼辦呢?

b=7/4;

這樣b就是它們的商了,應該是1。

也許有人就不明白了,7/4應該是1.75,怎麼會是1呢?這裡需要說明的是,當兩個整數相除時,所得到的結果仍然是整數,沒有小數部分。

要想也得到小數部分,可以這樣寫7.0/4或者7/4.0,也即把其中一個數變為非整數。

那麼怎樣由一個實數得到它的整數部分呢?這就需要用強制型別轉換了。例如:

a=(int) (7.0/4);

因為7.0/4的值為1.75,如果在前面加上(int)就表示把結果強制轉換成整型,這就得到了1。那麼思考一下a=(float) (7/4);最終a的結果是多少?

單目減運算子相當於取相反值,若是正值就變為負值,若是負數就變為正值。

單目加運算子沒有意義,純粹是和單目減構成一對用的。

三、邏輯運算子

邏輯運算子是根據表示式的值來返回真值或是假值。其實在c語言中沒有所謂的真值和假值,只是認為非0為真值,0為假值。

符號 功能

&& 邏輯與

|| 邏輯或

! 邏輯非

例如:5!3;

0||-2&&5;

!4;當表示式進行&&運算時,只要有一個為假,總的表示式就為假,只有當所有都為真時,總的式子才為真。當表示式進行||運算時,只要有一個為真,總的值就為真,只有當所有的都為假時,總的式子才為假。邏輯非(!

)運算是把相應的變數資料轉換為相應的真/假值。若原先為假,則邏輯非以後為真,若原先為真,則邏輯非以後為假。

還有一點很重要,當一個邏輯表示式的後一部分的取值不會影響整個表示式的值時,後一部分就不會進行運算了。例如:

a=2,b=1;

a||b-1;

因為a=2,為真值,所以不管b-1是不是真值,總的表示式一定為真值,這時後面的表示式就不會再計算了。

四、關係運算子

關係運算子是對兩個表示式進行比較,返回一個真/假值。

符號 功能

> 大於

< 小於

>= 大於等於

<= 小於等於

== 等於

!= 不等於

這些運算子大家都能明白,主要問題就是等於==和賦值=的區別了。

一些剛開始學習c語言的人總是對這兩個運算子弄不明白,經常在一些簡單問題上出錯,自己檢查時還找不出來。看下面的**:

if(amount=123) ……

很多新人都理解為如果amount等於123,就怎麼樣。其實這行**的意思是先賦值amount=123,然後判斷這個表示式是不是真值,因為結果為 123,是真值,那麼就做後面的。如果想讓當amount等於123才執行時,應該if(amount==123) ……

五、自增自減運算子

這是一類特殊的運算子,自增運算子++和自減運算子--對變數的操作結果是增加1和減少1。例如:

--couter;

couter--;

++amount;

amount++;

看這些例子裡,運算子在前面還是在後面對本身的影響都是一樣的,都是加1或者減1,但是當把他們作為其他表示式的一部分,兩者就有區別了。運算子放在變數前面,那麼在運算之前,變數先完成自增或自減運算;如果運算子放在後面,那麼自增自減運算是在變數參加表示式的運算後再運算。這樣講可能不太清楚,看下面的例子:

num1=4;

num2=8;

a=++num1;

b=num2++;

a =++num1;這總的來看是一個賦值,把++num1的值賦給a,因為自增運算子在變數的前面,所以num1先自增加1變為5,然後賦值給a,最終a也為5。b=num2++;這是把num2++的值賦給b,因為自增運算子在變數的後面,所以先把num2賦值給b,b應該為8,然後num2自增加1變為 9。

那麼如果出現這樣的情況我們怎麼處理呢?

c=num1+++num2;

到底是c=(num1++)+num2;還是c=num1+(++num2);這要根據編譯器來決定,不同的編譯器可能有不同的結果。所以我們在以後的程式設計當中,應該儘量避免出現上面複雜的情況。

六、複合賦值運算子

在賦值運算子當中,還有一類c/c++獨有的複合賦值運算子。它們實際上是一種縮寫形式,使得對變數的改變更為簡潔。

total=total+3;

乍一看這行**,似乎有問題,這是不可能成立的。其實還是老樣子,'='是賦值不是等於。它的意思是本身的值加3,然後在賦值給本身。為了簡化,上面的**也可以寫成:

total+=3;

複合賦值運算子有下列這些:

符號 功能

+= 加法賦值

-= 減法賦值

*= 乘法賦值

/= 除法賦值

%= 模運算賦值

<<= 左移賦值

>>= 右移賦值

&= 位邏輯與賦值

|= 位邏輯或賦值

^= 位邏輯異或賦值

上面的十個複合賦值運算子中,後面五個我們到以後位運算時再說明。

那麼看了上面的複合賦值運算子,有人就會問,到底total=total+3;與total+=3;有沒有區別?答案是有的,對於a=a+1,表示式a被計算了兩次,對於複合運算子a+=1,表示式a僅計算了一次。一般的來說,這種區別對於程式的執行沒有多大影響,但是當表示式作為函式的返回值時,函式就被呼叫了兩次(以後再說明),而且如果使用普通的賦值運算子,也會加大程式的開銷,使效率降低。

七、條件運算子

條件運算子(?:)是c語言中唯一的一個三目運算子,它是對第一個表示式作真/假檢測,然後根據結果返回兩外兩個表示式中的一個。

《表示式1>?《表示式2>:《表示式3>

在運算中,首先對第一個表示式進行檢驗,如果為真,則返回表示式2的值;如果為假,則返回表示式3的值。

例如:a=(b>0)?b:-b;

當b>0時,a=b;當b不大於0時,a=-b;這就是條件表示式。其實上面的意思就是把b的絕對值賦值給a。

八、逗號運算子

在c語言中,多個表示式可以用逗號分開,其中用逗號分開的表示式的值分別結算,但整個表示式的值是最後一個表示式的值。

假設b=2,c=7,d=5,

a1=(++b,c--,d+3);

a2=++b,c--,d+3;

對於第一行**,有三個表示式,用逗號分開,所以最終的值應該是最後一個表示式的值,也就是d+3,為8,所以a=8。對於第二行**,那麼也是有三個表示式,這時的三個表示式為a2=++b、c--、d+3,(這是因為賦值運算子比逗號運算子優先順序高)所以最終表示式的值雖然也為8,但a2=3。

還有其他的如位邏輯運算子,位移運算子等等,我們等到講位運算時再說明。

九、優先順序和結合性

從上面的逗號運算子那個例子可以看出,這些運算子計算時都有一定的順序,就好象先要算乘除後算加減一樣。優先順序和結合性是運算子兩個重要的特性,結合性又稱為計算順序,它決定組成表示式的各個部分是否參與計算以及什麼時候計算。

下面是c語言中所使用的運算子的優先順序和結合性:

優先順序 運算子 結合性

(最高) () -> . 自左向右

! ~ ++ -- + - * & sizeof 自右向左

* / % 自左向右

+ - 自左向右

<< >> 自左向右

< <= > >= 自左向右

== != 自左向右

& 自左向右

^ 自左向右

| 自左向右

&& 自左向右

|| 自左向右

?: 自右向左

= += -= *= /= %= &= ^= |= <<= >>= 自右向左

(最低) , 自左向右

c語言中位移位運算子C語言中位移位運算子

位移運算子 符號 描述 左移 右移 位移運算子作用於其左側的變數,其右側的表示式的值就是移動的位數,運算結果就是移動後的變數結果。b a 2 就是a的值左移兩位並賦值為b。a本身的值並沒有改變。向左移位就是在低位補0,向右移位就是在高位上補0。右移時可以保持結果的符號位,也就是右移時,如果最高位為1...

c語言中邏輯運算子用法,C語言中邏輯運算子用法

1 邏輯運算子bai是根據du表示式的值來返zhi回真值或是假值dao。在c語言中沒有專版門的真值和假值,認定權非0為真值,0為假值。2 邏輯運算子運算規則 或 兩個條件中,只要有一個成立,則結果就成立 與 兩個條件中,兩個同時成立,則結果成立,否則不成立 非 取反之意,如果是真,結果是假,如果是假...

C語言中怎樣理解三目運算子(條件運算子)的右結合性

這裡涉及了c中的優先順序 結合性 求值順序。結合性只有在相同優先順序的運算子間才起作用,比如a b c,與 優先順序不同,這裡根本不用去管結合性。而a b c則需要進行結合性考慮了,如果 為左結合性,那麼應該理解為 a b c,如果 為右結合性,那麼應該理解為a b c 當然了,我們已經知道 為左結...