1. 程式人生 > >c語言學習筆記(8)位運算子,++,--運算子的用法

c語言學習筆記(8)位運算子,++,--運算子的用法

摘要:總結了位運算子,++,--運算子的用法,給出了一個使用異或方法巧解面試題的例子,分析了貪心法的規則。

一、位運算子用法

    c語言中的位運算子主要有以下幾種:

   

    使用的時候主要有以下幾個注意點:

    1.左移運算子將<<將運算數的二進位左移,高位丟棄,低位補零。

    2.右移運算子將>>將運算數的二進位右移,低位丟棄,高位補零。

    3.避免位運算子,邏輯運算子和數學運算子出現在同一個表示式中,如果要在同一個表示式中出現,那麼需要用括號來表達運算次序。

4.左移n位相當於乘以2的n次方,右移n位相當於除以2的n次方,但是他們的運算效率要比數學運算子高。

不用第三個中間變數實現兩個數的交換

    方法1:

    a=a+b;

    b=a-b;

    a=a-b;

    方法2:

    a=a^b;

    b=a^b;

    a=a^b;

    面試題解析

    有一個數列,其中的自然數都是以偶數的形式出現,只有一個自然數出現的次數為奇數次。編寫程式找出這個自然數。

    最簡單的方法使用異或方法,如下:

<span style="font-size:18px;">#include <stdio.h>
 
#define SIZE(a) sizeof(a)/sizeof(*a)
 
int a[]={1,2,3,4,5,2,3,4,5,1,1,1,1,1,2};
 
int main(void)
{
    intresult=0;
    inti=0;
   
    for(i=0;i<SIZE(a);i++)
    {
       result=result^a[i]; 
    }
   
    printf("result=%d\n",result);
   
    return0;
}</span>

    這主要運用了兩個規則:第一,自己和自己異或等於0;第二:異或具有交換律的特性。

    1<<32位的結果是什麼?1<<-1的結果是什麼?

<span style="font-size:18px;">#include <stdio.h>
 
int main(void)
{
   
    printf("%d\n",1<<32);
    printf("%d\n",1<<-1);
   
    return0;
}</span>

編譯出現如下錯誤:

    其實這個是可以理解的,因為我們資料int時32位的,這樣就越界了,負數這裡不允許移位,在我看來也沒有什麼具體的意義,如有知道的大俠可以告知。

二、++和—運算子的用法

先看一個例子:

i=3;(++i)+(++i)+(++i)等於多少?

答案一定不是15,而是根據編譯器的規則,一般是16,也可能是18。第一種,它結合前兩個,先++i兩次使得i=5,,再兩者相加等於10,然後再計算最後一個++i,這時候i=6,然後再全部相加=16.第二種,它直接將三個括號裡面的++i先計算,使得i=6,然後三者相加=18。具體哪一種根據編譯器來決定,這屬於c語言的灰色地帶,為什麼是灰色地帶,因為一般沒有人這麼寫。。。

    其實++和—我們用的已經很熟練,但是這裡有一個貪心法,還是蠻有意思,規則如下:

    1.編譯器處理的每個符號,應該儘可能多的包含字元。

    2.編譯器以從左向右的順序一個一個儘可能多的讀入字元。

    3.當即將讀入的字元不可能和已讀入的字元組成合法符號為止。

    4.為了避免貪心發造成的混淆,我們可以適當的使用空格將字元斷開。

    貪心法的例子

c=a+++b;編譯器會從左到右,儘可能的多讀,這樣就變成了a++ + b,如果a=1,b=2,那麼最終c的值是3,a變為2,因為a++是先取走a的值再自增1。

    同時,為什麼我們寫成/*的形式之後,後面接著的字元全部變為了註釋,這樣是貪心法和註釋規則導致的。

    這部分比較簡單,就總結到這裡,如有不正確的地方還請指出,大家共同進步。

相關推薦

c語言學習筆記8運算子++--運算子用法

摘要:總結了位運算子,++,--運算子的用法,給出了一個使用異或方法巧解面試題的例子,分析了貪心法的規則。 一、位運算子用法     c語言中的位運算子主要有以下幾種:         使用的時候主

c 語言學習筆記基礎

lac alert https 內容 con 標記 prime c++ prime c基礎 近期工作上有對C語言算法上的需求,所以要學C,上學的時候沒學過,只學過半年的Java(我是專升本,本科學的材料),2015年工作後也學過C,那時候的需求是能看懂就可以,也就沒深入研究

匯編語言學習筆記8——數據處理的基本問題

byte 緩沖器 表達 基本 操作 進行 能夠 ng- 尺寸 1、僅僅有“bx、si、di、 bp”四個寄存器能夠用在[…]中來進行內存單元的尋址 2、這四個寄存

C語言學習筆記4—— 數據類型的使用

循環小數 強制類型轉換 進行 代碼 size 圖片 unsigned 問題 d+  在程序設計語言裏,我們會把數據分為各種各樣的類型,為什麽會有數據類型之分呢?計算機中,所有的數據都會表示成二進制數的形式,對於同樣的一個二進制數,數據類型不同,它表示的數據就是不同的。也就是

C語言學習筆記5—— 語句1

  c程式常見結構大概有選擇結構,迴圈結構,順序結構。c程式由一個一個的函式構成,而構成函式的則是語句,語句包含賦值語句,迴圈語句,條件語句,分支語句。賦值語句對與我們來說是很熟悉的。條件語句,分支語句與迴圈語句則會在後面一一介紹到。   順序結構對於我們來說是很熟悉的,它可以是這個樣子。 &nbs

C語言學習筆記5—— 語句2

  在介紹過順序結構和選擇結構以後,我們能通過c語言做的事依舊很少,比如換硬幣問題。將一元的人民幣換成一分,兩分,五分的硬幣共50枚。如何解決這樣的問題呢?我們可以把它化解成一個求解線性方程組的問題。   可以設需要一分的硬幣x枚,兩分的硬幣y枚,五分的硬幣z枚。於是,我們可以得到一個方程組,像這樣:x+y

Go語言學習筆記8面向物件

package main import "fmt" func main() { //定義treeNode結構體 var root treeNode root = treeNode{value:3} fmt.Println(root) fmt.Println() root.left

C語言學習記錄8列印三角圖形

C語言學習記錄 前言 一直自己沒有學習做筆記的習慣,所以為了加強自己對知識的深入理解,決定將學習筆記寫下來,希望向各位大牛們學習交流! 不當之處請斧正!在此感謝!這邊就先從學習C語言寫起,自己本身對程式語言方面不擅長,所以決定對此從基礎開始學習, 大牛們對此文可

C語言學習筆記

while語句: 表示式1 while(表示式2) { 語句1 語句2 表示式3; } do-while語句 表示式1; do{ 語句1 語句2 表示式3; }while(表示式2); 選擇迴圈語句的一般原則 迴圈次數已知

C語言學習筆記

break本質是受限的goto語句,跳轉的位置限定為緊接著迴圈語句後的第一條語句。 exit(0);終止整個程式的執行強制返回作業系統,當其引數為0時,表示程式出現某種錯誤後退出 continue與break的區別: break:退出一層迴圈或switch,轉到

C語言學習筆記---一些刷題記錄

最近在學校的oj上做了一些題目,都不是很難,今天本想統一寫一下題解但時間太晚,篇幅太長,於是先寫三道比較基礎的。這兩天被一道題卡了好久,最後在dalao的指導下改了輸入方式就過了。我們討論了好久也沒弄清楚到底是哪出了問題,有點難過,想早點休息。 學校的oj外網

C語言學習筆記—— 運算子、表示式和語句

一、運算子1、賦值運算子:=        賦值表示式的目的是把值儲存到記憶體位置上,用於儲存值的資料區域統稱為資料物件,使用變數名是標識物件的一種方法。物件指的是實際的資料儲存,左值是用於標識和定位儲存位置的標籤,右值指的是能賦值給可修改左值的量。void example1

C#語言學習筆記:變量、數據類型和運算符

tex ear 布爾值 全部 exchange result 轉換成 lis int 變量、數據類型 給變量賦值,如果想指定float,在數字後面加上F/f;如果想指定decimal,在數字後面加上m。 0-9:48-57 A-Z:65-90 a-

C語言學習筆記—— 初識C語言並寫一個簡單的C語言程式

1、目的碼檔案、可執行檔案、庫用C語言編寫程式時,編寫的內容被儲存在文字檔案中,該檔案被稱為原始碼檔案,檔案以.c結尾。目標檔案和可執行檔案都是由機器語言指令組成的,但是目標檔案只包含編譯器為你編寫的程式碼翻譯的機器語言程式碼,可執行檔案還包含你編寫的程式中使用的庫函式和啟動

C語言學習筆記—— 函式、遞迴和指標

一、函式1、一個簡單的函式示例函式是完成特定任務的獨立程式程式碼單元。#include <stdio.h> void printStar();//宣告函式原型,函式原型會指明函式的型別和函式接受的引數。前面的void是函式型別,表明函式沒有返回值 #define

C語言學習筆記

一、取地址符的錯用 include <stdio.h> int main() { int i; scanf("%d",&i); printf("%d",i); } 如果將輸出語句改為printf("%d",&i);編譯並不會報錯,但得不到想要的結果

C語言學習筆記十二

函式原型與函式定義的區別: 函式定義 函式原型 指函式功能的確立 對函式名、返回值型別、形參型別進行宣告 有函式體

C#學習筆記8-介面

作用 繼承具有單根性,也就是一個子類只能有一個父類。若這個子類向呼叫另一個子類中的方法,可以考慮使用介面。 關鍵字 語法 [public ] interface I…able { 成員; } -介面就是一個規範,一種能力 -介面中的成員

mysql必知必會--學習筆記8--子查詢 where巢狀查詢語句作為計算欄使用子查詢

1、子查詢的查詢過程一般是通過where中的in操作符來完成,in後面跟上一個子查詢,通常in之前的列名和子查詢查詢出來的列名是一致的。例如select name from book where id in (select book_id from store where s

C語言開發筆記獲取整數的個十百千

#include <stdio.h> int main(void) { unsigned int number = 0; unsigned int single_digit = 0; unsigned int ten_digit = 0; unsigne