目錄:
1.前言
2.數值在計算機中的表示
3. 位運算
4.位段
正文:1.前言
為了節省記憶體空間,在系統軟體中常將多個標誌狀態簡單地組合在一起,儲存到乙個位元組(或字)中。c語言是為研製系統軟體而設計的,所以她提供了實現將標誌狀態從標誌位元組中分離出來的位運算功能。
所謂位運算是指,按二進位制位進行的運算。
2.數值在計算機中的表示
1) 二進位制位與位元組
計算機系統的記憶體儲器由許位元組的單元組成
1byte=8bit(每位的取值為0/1)
7 6 5 4 3 2 1 0
上圖表示乙個位元組的編號,最左端位最高位,最右端為最低位
2) 數值的原碼表示
原碼:最高位為符號位(0正數,1負數),其餘各位代表數值本身的絕對值(以二進位制表示)
ps:約定用1個位元組表示1個整數
例:+9 --> 0000 1001
-9 --> 1000 1001
3) 數值的反碼表示
反碼:正數=原碼
負數=符號位不變,其餘位取反
例:+9--->0000 1001
- 9--->1111 0110
4) 數值的補碼表示
補碼:正數=原碼
負數=符號位不變,其餘按位取反,然後整個數加1
例:+9--->0000 1001
- 9--->1111 0111
5) 數值在計算機中的表示──補碼
在計算機系統中,數值一律用補碼表示(儲存),原因在於:
* 可以將符號位和其它位統一處理
* 減法也可按加法來處理。另外,兩個用補碼表示的數相加時,如果最高位(符號位)有進製,則進製被捨棄.
3.位運算
3.1 位運算及其運算子
note:(1)x,y和位數等運算元只能為int,char型.(2)僅~為單目運算子,其餘均為雙目運算子(3)~0間接構造乙個全1的數
1) 按位與 ── &
(1)格式:x&y
(2)規則:對應位均為1時才為1,否則為0:3&9=1。
(3)主要用途:取(或保留)1個數的某(些)位,其餘各位置0。
例,3&9=1
0011
& 1001
────
0001=1
2)按位或 ── |
(1)格式:x|y
(2)規則:對應位均為0時才為0,否則為1:3|9=11。
(3)主要用途:將1個數的某(些)位置1,其餘各位不變。
例,3|9=11
0011
| 1001
────
1011=11
3)按位異或---^
(1)格式:x^y
(2)規則:對應位相同為0,不同為1:3^9=10。
(3)主要用途:將1個數的某(些)位置1,其餘各位不變。
4)按位取反── ~
(1)格式:~x
(2)規則:各位翻轉,即原來為1的位變成0,原來為0的位變成1:在ibm-pc機中,
~0=0xffff,~9=0xfff6。
(3)主要用途:間接地構造乙個數,以增強程式的可移植性。
5)按位左移── <<
(1)格式:x《位數
(2)規則:使操作的各位左移,低位補0,高位溢位:5<<2=20。
6)按位右移──>>
(1)格式:x>>位數
(2)規則:使操作的各位右移,移出的低位捨棄;
高位:1)對無符號數和有符號中的正數,補0;
2)負數取決於所使用的系統:補0的稱為邏輯右移,補1的稱為算術右移
位操作的應用:
例子1:
從鍵盤上輸入1個正整數給int變數num,輸出由8~11位構成的數(從低位、0號開始編號)。
基本思路:
(1)使變數num右移8位,將8~11位移到低4位上。
(2)構造1個低4位為1、其餘各位為0的整數。
(3)與num進行按位與運算.
程式:[code]
#include
int main(void)
[/code]
例子2:
從鍵盤上輸入1個正整數給int變數num,按二進位制位輸出該數。
程式:
#include "stdio.h"
main()
printf("\bb\n");
}
例子3:
給定乙個整數a,寫兩個函式,第乙個對a設定bit3,第二個清除bit3,其它位不變。
程式:
#define bit3 ox1<<3
static int a;
void set_bit3()
void clear_bit3()
C語言中位操作
0 0 0 0 1 0 1 0 0 1 1 1 0 0 0 0 1 1 1 0 1 1 1 1 1.不改變其他位的值的狀況下,對某幾個位進行設值。先對需要設定的位用 操作符進行清零操作,然後用 操作符設值。比如我要改變 gpioa 的狀態,可以先對暫存器的值進行 清零操作 gpioa crl 0xf...
C 語言中的位操作
在微控制器或是工業控制中,位操作是很常見的,利用微控制器實現跑馬燈的例項就可以通過位操作來實現。c 語言中也能夠實現位操作。微操作是針對資料的二進位制補碼形式的操作,位操作符主要有 位運算子含義 與 或 非 異或 左移 右移 與等 或等 異或等 左移等 右移等 可以用下邊的類似程式實現二進位制的輸出...
學習C語言中的位操作
最近在寫程式時,我需要判斷乙個dword 型別變數的某乙個二進位制位是否為1或0,我們都很清楚,dword型別的變數在記憶體中佔32位,現在要我們判斷其中的某一位是0還是1,該如何是好呢?這時我想到了c語言中的位操作,借助位操作,可以實現我們想要的功能。關於位操作,我從網上收集整理的資料如下 一 位...