日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

C语言位运算符详解

發布時間:2023/12/3 综合教程 30 生活家
生活随笔 收集整理的這篇文章主要介紹了 C语言位运算符详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 位運算符
    • 簡介
    • 總概
    • 1、按位與(&)
    • 2、按位與(I)
    • 3、按位異或(^)
    • 3、按位取反(~)
    • 5、按位左移(<<)
    • 6、按位右移(>>)

位運算符

簡介

C語言既具有高級語言的特點,又具有低級語言的特性,如支持位運算就是其具體體現。這是因為,C語言最初是為取代匯編語言設計系統軟件而設計的,因此C語言必須支持位運算等匯編操作。位運算就是對字節或字內的二進制數位進行測試、抽取、設置或移位等操作。其操作對象不能是float、double、long double等其他數據類型,只能是char和int類型。
C語言提供如下表格的六種位運算符,其中,只有按位取反運算符為單目運算符,其他運算符都是雙目運算符。

總概

位運算符

運算符 含義 類型 優先級 結合性
~ 按位取反 單目運算符 從右向左
<<,>> 按位左移、按位右移 雙目運算符 從左向右
& 按位與 雙目運算符 從左向右
^ 按位異或 雙目運算符 從左向右
I 按位或 雙目運算符 從左向右

補充:
單目運算符:只對一個操作數進行邏輯運算,例如:~a
雙目運算符:只對兩個操作數進行邏輯運算,例如:a & b
三目運算符:只對三個操作數進行邏輯運算且只有一個,例如:a ?b : c
其中a可以是表達式也可以是一個值,用于判斷真假,若a為真,則結果為b;若a為假,則結果為c。
主要區別:操作數(常量或者變量)數量的不同。

位運算符的運算規則

a b a & b a I b a ^ b ~ a
0 0 0 0 0 1
0 1 0 1 1 1
1 0 0 1 1 0
1 1 1 1 0 0

下面我會對這些運算符的使用進行逐一解釋說明:

1、按位與(&)

按位與可用于對字節中的某位清零,即兩個操作數中的任意一位為0時,運算結果的對應位就會被置0。也可以簡單記為(11為1,否則為0),例題如下,只保留15的最低位不變,在其余位均置為0,可用15 & 1來實現,即:

00001111(15) &??? 00000001 (1) _____________________ 00000001 (1)

首先將15和1換為二進制形式,由11為1,否則為0算出二進制結果,最后得出十進制結果。其中,15和1均以補碼形式表示,所以,15 & 1 = 1
代碼如下:

2、按位與(I)

與按位與相反,按位或可用于對字節中的某位置1,即兩個操作數中的任意一位為1時,運算結果的對應位就會被置為1。也可以簡單記為(00為0,否則為1),例題如下,只保留15的最高位不變,而其余位均置為1,可用15 I 127 來實現,即:

0? 0? 0? 0? 1? 1? 1? 1(15) I??? 0? 1? 1? 1? 1? 1? 1? 1 (127) _____________________ 0? 1? 1? 1? 1? 1? 1? 1 (127)

首先將15和127換為二進制形式,由00為0,否則為1算出二進制結果,最后得出十進制結果。其中
01111111是127的補碼,所以15 I 127 = 127
代碼實現如下:

3、按位異或(^)

如果兩個操作數的某對應位不一樣,則按位異或結果的對應位為1,簡單記為(相同為0,不同為1)。例如,3 ^ 5的運算過程可表示為:

00000011(3) &???? 00000101 (5) _____________________ 00000110 (6)

首先將3和5華為二進制形式,由相同為0,不同為1算出二進制形式,再轉化為十進制結果。其中,00000110是6的補碼,所以3 ^ 5 = 6。
代碼實現如下:

3、按位取反(~)

按位取反是對操作數的各位取反,即1變為0,0變為1。例如,~5的運算過程可以表示為:

~???? ? 00000101(5) _____________________ 11111010 (-6)

首先將5化為二進制形式,由若1則0,若0則1得出二進制形式結果,在化為十進制即可。其中11111010是-6的補碼,所以~5 = -6。
補充(負數的補碼):C語言里面有原碼,反碼,補碼這三種碼,計算機里存儲的數據都是補碼形式,因為補碼具有唯一的性質,補碼的二進制形式中,首位數字如果是1,則十進制數字就是負數;如果是0,則二進制數字就是正數。對于負數的補碼怎么求,我們可以先算出該負數的絕對值的二進制形式,再取反(即1變0,0變1),最后再加1,需要注意的是,二進制當中,兩數相加為2則需進一位,與十進制中,兩數相加為10則需進一位是一個道理。反之,已知負數的補碼求十進制形式,我們倒推,則先減一,再取反,最后化為十進制結果就行了。
拓展:(了解)
按位取反常用于加密處理。例如,對文件加密時,一種簡單的方法就是對每個字節按位取反,如下圖所示:

初始字節內容????????00000101 一次求反后?????????11111010 二次求反后?????????00000101

在上述操作中,經過連續的兩次求反后,又恢復了原來的初始值,因此第一次求反可加密,第二次求反可用于解密。
代碼如下:

5、按位左移(<<)

假設一個常量x,左移n位,則按位左移表示把x的每一位向左平移n位,右邊空位補0。例如,15及其左移一位、二位、三位的二進制代碼如下:

初始字節內容????00001111????對應十進制值為15 左移一位后的字節內容????00011110????對應十進制值為30 左移二位后的字節內容????00001111????對應十進制值為60 左移三位后的字節內容????01111000????對應十進制值為120

可以這樣記,n為多少,從左往右就去掉多少位,在最右邊補相應個數的0即可。
代碼如下:

6、按位右移(>>)

假設一個常量x,右移n位,x >> n則表示把x的每一位向右平移n位。當x為有符號數時,左邊空位補符號位上的值(即負數補1),這種一位移位稱為算術移位;當x為無符號數時,左邊空位補0(即正數補0),這種移位稱為邏輯移位。下面我們舉兩個例子:
1、15按位右移一位,二位,三位的結果如下:

初始字節內容????00001111????對應十進制值為15 左移一位后的字節內容????00000111????對應十進制值為7 左移二位后的字節內容????00000011????對應十進制值為3 左移三位后的字節內容????00000001????對應十進制值為1

代碼如下:

再如,-15按位右移一位,二位,三位的結果如下:

初始字節內容????11110001????對應十進制值為-15 左移一位后的字節內容????11111000????對應十進制值為-8 左移二位后的字節內容????11111100????對應十進制值為-4 左移三位后的字節內容????11111110????對應十進制值為-2

代碼如下:

**總結:**在實際運用中,通常用左移位和右移位來代替整數的乘法和除法,以便于將軟件算法用硬件實現。其中,每左移一位相當于乘以2,左移n位相當于乘以2的n次方。每右移一位相當于除以2,右移n位相當于除以2的n次方。這種運算在某些場合下是非常有用的。例如,在實現某些含有乘除法的算法時,可以通過移位運算實現乘2或除2運算,這樣非常有利于算法的硬件實現。

以上就為大家總結了C語言位運算符的計算方法,雖然容易混淆,但是下去多練,多操作就會很快記住啦!如果大家在讀完這篇博客后有所幫助,請給我點個贊關注一下吧!謝謝大家了。如果有什么問題,可以在下方評論,或者加我QQ:1423759736,我會及時回復的!

總結

以上是生活随笔為你收集整理的C语言位运算符详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。