程序中的所有數(shù)在計(jì)算機(jī)內(nèi)存中都是以二進(jìn)制的形式儲(chǔ)存的。位運(yùn)算就是直接對(duì)整數(shù)在內(nèi)存中的二進(jìn)制位進(jìn)行操作。C語言中位運(yùn)算符: &(按位與)、| (按位或)、~(按位取反)、 <<(左移)、>>(右移) 、^(異或運(yùn)算)。
計(jì)算機(jī)所能識(shí)別的即為二進(jìn)制數(shù),位運(yùn)算就是按位運(yùn)算, 因而同等情況下位運(yùn)算效率一般都高于其它方式。
1.位運(yùn)算特性
unsigned char a=0x45,b=0x89; a=0x45(0100 0101) b=0x89(1000 1001)
位運(yùn)算 |
規(guī)則 |
示例 |
&(按位與) |
全1為1,有0則0 | a&b=0x1(0000 0001b) |
|(按位或) | 有1為1,全0則0 | a|b=0xcd(1100 1101b) |
~(按位取反) |
對(duì)每一位進(jìn)行取反,1變0,0變1 |
~a=0xba(1011 1010) ~b=0x76(0111 0110) |
<<(左移) |
高位溢出,低位補(bǔ)0 |
(a<<1)=0x8a(1000 1010) (b<<1)=0x12(0001 0010) |
>>(有移) |
低位溢出,高位補(bǔ)0 |
(a>>1)=0x22(0010 0010) (b>>1)=0x44(0100 0100) |
^(異或運(yùn)算) |
相同為0,不同為1 |
a^b=0xcc(1100 1100) |
- 優(yōu)先級(jí)關(guān)系:
~(取反)
<<(左移) ? >>(右移)
&按位與
^(按位異或)
|(按位或)
2.示例
#include
int main()
{
unsigned char a=0x45,b=0x89;
printf("與運(yùn)算a&b:%#xn",a&b);
printf("或運(yùn)算a|b:%#xn",a|b);
printf("取反運(yùn)算~a:%#xt ~b:%#xn",~a&0xff,~b&0xff);
printf("左移a>1:%#xt b>>1:%#xn",a>>1,b>>1);
printf("異或a^b:%#xn",a^b);
}
[wbyq@wbyq 123]$ gcc main.c
[wbyq@wbyq 123]$ ./a.out
與運(yùn)算a&b:0x1
或運(yùn)算a|b:0xcd
取反運(yùn)算~a:0xba ~b:0x76
左移a>1:0x22 b>>1:0x44
異或a^b:0xcc
3.位運(yùn)算練習(xí)
1.定義兩個(gè)變量unsigned char a=0x45,b=0x89;將a的第6位清0,將b的第4位置1;
2.定義兩個(gè)整型變量a,b將a,b的值交換位置(不借助第三個(gè)變量,使用位運(yùn)算);
3.定義一個(gè)整型變量data,將字符'a'、'b'、'c'、'd' 保存到data中,并輸出字符abcd;
4.漢字點(diǎn)陣輸出
漢字顯示我們每時(shí)每刻都在使用,那漢字是如何顯示在屏幕上的呢?通過位運(yùn)算的學(xué)習(xí)我們即可通過printf模擬函數(shù)輸出顯示。
例如我們需要在一個(gè)8*8的點(diǎn)陣方格中顯示一個(gè)”中”字。可以看做如下:

一個(gè)有8個(gè)格子,剛好一個(gè)字節(jié)有8位,一個(gè)方格中有兩個(gè)狀態(tài):空白和顯紅。我們可以把空白的地方看做0,把顯示紅色的地方看做1,這樣整個(gè)8*8個(gè)格我們就可以用8個(gè)字節(jié)表示,坐標(biāo)為高位,右邊為低位,高位在前方式。表示如下:
第一行:0x08;
第二行:0x08;
第三行:0x3e;
第四行:0x2a;
第五行:0x2a;
第六行:0x3e;
第七行:0x08;
第八行:0x08;
通過位運(yùn)算實(shí)現(xiàn)如下:
#include
const unsigned char buff[]={0x08,0x08,0x3E,0x2A,0x2a,0x3e,0x08,0x08};
int main()
{
int i,j;
unsigned char temp;
for(i=0;i

5.漢字顯示練習(xí)
1.通過PCtoLCD2002工具實(shí)現(xiàn)漢字取模進(jìn)行取模,封裝漢字顯示函數(shù),以橫向和縱向兩種方式顯示。

#include
#define FONT_SIZE 24
const char buf[][24*24/8]=
{
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x70,0x00,0x00,0x70,0x00,0x00,0x30,0x00,0x00,0x31,0xC0,0x00,0x7F,0xE0,0x0F,0xF0,0xE0,0x0E,0x30,0xE0,0x06,0x3F,0xC0,0x07,0xF9,0xC0,0x06,0x31,0x80,0x06,0x31,0x80,0x06,0xFF,0x00,0x03,0xF0,0x00,0x00,0x70,0x00,0x00,0x30,0x18,0x00,0x30,0x0C,0x00,0x38,0x1C,0x00,0x1F,0xFC,0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00},/*"電",0*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x7D,0xC0,0x01,0xE3,0xC0,0x00,0x07,0x00,0x00,0x06,0x00,0x00,0x3C,0x00,0x00,0x1C,0x1C,0x00,0x0F,0xFE,0x0F,0xFC,0x00,0x3C,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0x0E,0x00,0x00,0xFC,0x00,0x00,0x3C,0x00,0x00,0x18,0x00,0x00,0x00,0x00},/*"子",1*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x1C,0x00,0x00,0x1C,0xF0,0x01,0x9C,0x30,0x01,0xD8,0x00,0x01,0x99,0xE0,0x03,0xBF,0x80,0x03,0xF0,0x00,0x03,0x30,0x00,0x00,0x73,0x80,0x00,0x7F,0xC0,0x00,0xF3,0x80,0x00,0xFB,0x80,0x01,0xDF,0x00,0x01,0x8F,0x00,0x03,0x07,0x00,0x07,0x0F,0x80,0x0E,0x39,0xE0,0x18,0x60,0xF8,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00},/*"發(fā)",2*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x03,0x9C,0x00,0x03,0x0D,0xC0,0x03,0x0F,0x00,0x03,0x1E,0x60,0x03,0xF7,0xE0,0x33,0xE3,0xC0,0x1B,0x83,0xCC,0x1F,0x06,0xFC,0x03,0x1C,0x1C,0x03,0x00,0xE0,0x03,0x1F,0xC0,0x07,0x8D,0x80,0x07,0xCD,0x80,0x06,0xDD,0x80,0x0E,0x19,0x86,0x0C,0x31,0x86,0x18,0x71,0xCE,0x30,0xC0,0xFC,0x00,0x00,0x00,0x00,0x00,0x00},/*"燒",3*/
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x1C,0x00,0x00,0x18,0x00,0x00,0x38,0x00,0x00,0x3B,0xF0,0x03,0xFF,0x00,0x07,0xB0,0x00,0x00,0x70,0x00,0x00,0x60,0x00,0x00,0x6F,0xC0,0x00,0xFB,0x80,0x00,0xC3,0x80,0x01,0xF3,0x80,0x03,0xBB,0x00,0x03,0x0F,0x00,0x06,0x07,0x00,0x0C,0x0F,0x80,0x18,0x1D,0xC0,0x70,0x38,0xF0,0x01,0xE0,0x7F,0x00,0x00,0x00,0x00,0x00,0x00},/*"友",4*/
};
int main()
{
int i,j,k,x;
unsigned char temp;
for(i=0;i
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
-
計(jì)算機(jī)
+關(guān)注
關(guān)注
19
文章
7677
瀏覽量
90955
-
內(nèi)存
+關(guān)注
關(guān)注
8
文章
3128
瀏覽量
75348
-
C語言
+關(guān)注
關(guān)注
180
文章
7633
瀏覽量
142054
-
位運(yùn)算
+關(guān)注
關(guān)注
0
文章
17
瀏覽量
8576
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
熱點(diǎn)推薦
C語言基礎(chǔ)知識(shí)(4)--運(yùn)算符
C語言中,運(yùn)算符包括有算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符和位
C語言運(yùn)算符的使用方法
詳細(xì)介紹了C語言表達(dá)式、算術(shù)運(yùn)算符、賦值運(yùn)算符、關(guān)系運(yùn)算符、條件結(jié)構(gòu)、邏輯運(yùn)算符、
發(fā)表于 11-02 11:30
?2385次閱讀
【跟我學(xué)單片機(jī)C語言】詳解運(yùn)算符和表達(dá)式的位運(yùn)算符
【跟我學(xué)單片機(jī)C語言】詳解運(yùn)算符和表達(dá)式的位運(yùn)算符學(xué)過匯編的朋友都知道匯編對(duì)位的處理能力是很強(qiáng)的,但是單片機(jī)
發(fā)表于 12-07 13:51
C語言程序中位運(yùn)算的操作
在標(biāo)準(zhǔn)C語言的的教材中,對(duì)于位運(yùn)算的操作是基本不涉及的,但是在單片機(jī)系統(tǒng)的程序中,需要經(jīng)常操作各類以字節(jié)為單位的寄存器,而這些寄存器通常都是以二進(jìn)制中的
發(fā)表于 07-14 07:45
嵌入式C語言位運(yùn)算的相關(guān)資料推薦
提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔@[TOC]嵌入式C語言的位運(yùn)算一、pandas是什么?1.與運(yùn)算“&” 按
發(fā)表于 12-15 07:22
C語言位運(yùn)算與stm32調(diào)試原理介紹
C語言位運(yùn)算:“|=”或運(yùn)算,相應(yīng)位置1“&=”與運(yùn)算,相應(yīng)
發(fā)表于 02-23 06:52
單片機(jī)c語言教程第八章--運(yùn)算符和表達(dá)式(位運(yùn)算符)
學(xué)過匯編的朋友都知道匯編對(duì)位的處理能力是很強(qiáng)的,但是單片機(jī)C語言也能對(duì)運(yùn)算對(duì)象進(jìn)行按位操作,從而使單片機(jī)C
發(fā)表于 04-15 09:38
?1659次閱讀
C/C++語言位運(yùn)算詳解
位運(yùn)算是指按二進(jìn)制進(jìn)行的運(yùn)算。在系統(tǒng)軟件中,常常需要處理二進(jìn)制位的問題。C語言提供了6個(gè)
發(fā)表于 12-14 16:36
?4935次閱讀
C語言總結(jié)_語句、運(yùn)算符
當(dāng)前文章復(fù)盤C語言的: 位運(yùn)算運(yùn)算符、基本運(yùn)算符、數(shù)據(jù)類型、變量、for語句、while語句、g
C語言_語句與位運(yùn)算基本練習(xí)
總結(jié)C語言語句的幾個(gè)基本練習(xí)題,計(jì)算素?cái)?shù)、排序、求偶數(shù)和、可逆素?cái)?shù)、水仙花數(shù)、交換大小寫、交換變量的值、位運(yùn)算、語法特性等知識(shí)點(diǎn)。
C語言-基本數(shù)據(jù)類型與位運(yùn)算
這篇文章作為基礎(chǔ)知識(shí)點(diǎn),總結(jié)C語言的基本數(shù)據(jù)類型有哪些,浮點(diǎn)數(shù)的精度,整數(shù)變量的空間范圍,變量定義語法,變量命名規(guī)則,浮點(diǎn)數(shù)打印格式,基本數(shù)據(jù)類型printf對(duì)應(yīng)的打印、位運(yùn)算的知識(shí)點(diǎn)
C語言中必須要掌握的位運(yùn)算操作
C語言中,特別是在嵌入式的開發(fā)中,位操作是很常用的一個(gè)知識(shí)點(diǎn),涉及到按位(bit)操作的地方也是很常見的。本文分享一些C
評(píng)論