欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

談談C語言中位運算你要知道的那些事兒

 更新時間:2022年02月18日 09:48:39   作者:Code_流蘇  
C語言中的各種運算都是以字節(jié)的形式進行,在編寫很多系統程序時,如驅動程序、磁盤文件管理程序等,常要求將數據按位(bit)進行運算或者處理,下面這篇文章主要給大家介紹了關于C語言中位運算的相關資料,需要的朋友可以參考下

一、概念說明

1.概念

先來看一下位運算的概念:

1.1位運算

位運算簡單來說,就是按二進制位進行運算。

位運算: 從現代計算機中所有的數據二進制的形式存儲在設備中。即 0、1 兩種狀態(tài),計算機對二進制數據進行的運算(+、-、*、/)都是叫位運算,即將符號位共同參與運算的運算。

了解了位運算之后,我們來看一下位運算符

1.2位運算符

符號描述運算規(guī)則
&按位與兩個位都為1時,結果才為1
|按位或兩個位都為0時,結果才為0
^按位異或兩個位相同為0,相異為1
~按位取反0變1,1變0
<<左移各二進位全部左移若干位,高位去掉,低位補0
>>右移各二進位全部右移若干位,對無符號數,高位補0,有符號數,編譯器不同,處理方法不同

關于右移:不同的編譯器處理方法可能會不一樣,有的會補符號位,有的會補0。

 ★小提示:
 a.邏輯位運算都是以 (bit)為單位。
 b.位運算符的操作數必須是整數/字符類型。

2.舉例及補充

2.1位運算

以+為例

舉一個簡單的例子來看下( + - * \)位運算:

int a = 3;
int b = 4;
int c = a + b;

計算兩個數的和,因為在計算機中都是以二進制來進行運算,所以上面我們所給的 int 變量會在機器內部先轉換為二進制在進行相加:

3(a): 0 0 0 0 0 0 1 1

加上(+)

4(b): 0 0 0 0 0 1 0 0

等于(=)

7(c ): 0 0 0 0 0 1 1 1

通過觀察我們可以發(fā)現,相比在代碼中直接使用(+、-、*、/)運算符,如果有位運算符的話,代碼運行效率會不會更高,隨著位運算符后續(xù)的出現,發(fā)現其實確實是這樣。

下面一起來看一下位運算符:

2.2位運算符

關于每個運算符舉一個簡單的例子,來加深理解。

2.2.1按位與“&”

運算規(guī)則:
0 & 0 = 0  
0 & 1  =0  
1 & 0 = 0  
1 & 1 = 1
簡要口訣:(同1為1,其余為0)

例如:

3 & 5
0000 0011(十進制:3)
&
0000 0101(十進制:5)
=
0000 0001 (十進制:1)

因此結果等于1(十進制)

2.2.2按位或“|”

運算規(guī)則:0 | 0 = 0   
0 | 1 = 1  
1 | 0 = 1  
1 | 1 = 1
簡要口訣:同0為0,其余為1

例如:

3 | 5
0000 0011(十進制:3)
|
0000 0101(十進制:5)
=
0000 0111(十進制:7)

因此結果等于7(十進制)

2.2.3按位異或“^”

運算規(guī)則:
0 ^ 0 = 0  
0 ^ 1 = 1  
1 ^ 0 = 1  
1 ^ 1 = 0
簡要口訣:相同為0,不同為1

例如:

4 ^ 7
0000 0100(十進制:4)
^
0000 0111 (十進制:7)
=
0000 0011(十進制:3)

因此結果等于3(十進制)

2.2.4按位非(取反)“~”

運算規(guī)則:
~1 = 0  
~0 = 1
簡要口訣:1變0,0變1

例如:

~15
~0000 1111(十進制:~15)
=1111 0000(十進制:240)

因此結果等于240(十進制)

2.2.5左移“<<”

補充:若左移時舍棄的高位不包含1,則每左移一位,相當于該數乘以2。

例如:

1 << 2
即 1左移兩位
0000 0001(十進制:1)
左移兩位(<<2)后:
0000 0100(十進制:4)

結果為:4

2.2.6右移“>>”

補充: 操作數每右移一位,相當于該數除以2。

例如:

8 >> 2
即 8右移兩位
0000 1000(十進制:8)
右移兩位( >>2 )后:
0000 0010(十進制:2)

結果為:2

了解了這些概念之后,我們一起來看一下問題吧!

二、問題實戰(zhàn)

自己編寫了個題,僅用于學習,目的是為了加深對位運算的理解。

大家可以嘗試實現一下

1.問題描述(開放題)

Problem Description

自己設計程序,要求用六種位運算符實現對兩個整數的運算。

2.輸入輸出

Input

Output

兩個整數經六種位運算分別得到的結果

三、源碼實現(+詳細注釋)

1.注釋版

//編碼及注釋:Code_流蘇
//定義頭文件
#include<stdio.h>

int main()
{
	//給定兩個整數a和b 分別初始賦值為3和5
	//定義d e f g h i分別存儲各種位運算后的值
    unsigned char a=3,b=5,c,d,e,f,g,h,i;
    // a(3): 0000 0011
    // b(5): 0000 0101 
    
    //按位與 &
    c=a&b;
    //經過按位與運算,得到c的值為0000 0001
    //以十進制輸出
    printf("經過按位與運算后,可得c的值:%d\n",c);//輸出結果為1
    
    //按位或 |
    a=3;
    b=5;
    d=a|b;
    //經過按位或運算,得到c的值為0000 0111
	//以十進制輸出
    printf("經過按位或運算后,可得d的值:%d\n",d);//輸出結果為7
    
    //按位異或 ^
    a=3;
	b=5;
	e=a^b;
	//經過按位異或運算,得到c的值為0000 0110
	//以十進制輸出
	printf("經過按位異或運算后,可得e的值:%d\n",e);//輸出結果為6
	
	//按位非(取反) ~
	a=3;
	b=7; //0000 0111 此處重新賦值 排除偶然性
	f=~a;
	g=~b;
	//經過按位非(取反)運算,得到f的值為1111 1100 g的值為1111 1000
	//以十進制輸出
	printf("經過按位非運算后,可得f和g的值:%d %d\n",f,g);//輸出結果f的值為252,g的值為248
	
	//移位 左移:>> 右移:>>
	a=3;
	b=5;
	h=a<<2;
	i=b>>2;
	//經過位移運算,得到f的值為0000 1100 g的值為0000 0001
	//以十進制輸出
	printf("經過移位運算后,可得f和g的值:%d %d\n",h,i);//輸出結果h的值為12,i的值為1
    return 0;//返回0,代表程序執(zhí)行結束
}

關于unsigned char的解釋:

unsigned char是無符號字節(jié)型,char類型變量的大小通常為1個字節(jié)(1字節(jié)=8個位),且屬于整型。這就是為什么要用unsigned char的原因。

2.純源碼版

#include<stdio.h>
#include<stdlib.h>

int main()
{
    unsigned char a=3,b=5,c,d,e,f,g,h,i;

    c=a&b;
    printf("經過按位與運算后,可得c的值:%d\n",c);
    
    a=3;
    b=5;
    d=a|b;
    printf("經過按位或運算后,可得d的值:%d\n",d);
    
    a=3;
	b=5;
	e=a^b;
	printf("經過按位異或運算后,可得e的值:%d\n",e);
	
	a=3;
	b=7; 
	f=~a;
	g=~b;
	printf("經過按位非運算后,可得f和g的值:%d %d\n",f,g);
	
	a=3;
	b=5;
	h=a<<2;
	i=b>>2;
	printf("經過移位運算后,可得f和g的值:%d %d\n",h,i);
	
    return 0;
}

四、輸出結果展示

1.輸出結果

經過按位與運算后,可得c的值:1
經過按位或運算后,可得d的值:7
經過按位異或運算后,可得e的值:6
經過按位非運算后,可得f和g的值:252 248
經過移位運算后,可得f和g的值:12 1

--------------------------------
Process exited after 0.3508 seconds with return value 0
請按任意鍵繼續(xù). . .

2.輸出結果(圖示版)

總結

到此這篇關于C語言中位運算你要知道的那些事兒的文章就介紹到這了,更多相關C語言中的位運算內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++ 中動態(tài)鏈接庫--導入和導出的實例詳解

    C++ 中動態(tài)鏈接庫--導入和導出的實例詳解

    這篇文章主要介紹了C++ 中動態(tài)鏈接庫--導入和導出的實例詳解的相關資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • C++??STL?_?Vector使用及模擬實現

    C++??STL?_?Vector使用及模擬實現

    這篇文章主要介紹了C++ STL_Vector使用及模擬實現,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • C++ STL中常見的算法使用方式

    C++ STL中常見的算法使用方式

    這篇文章主要介紹了C++ STL中常見的算法使用方式,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • 二分圖匹配實例代碼及整理

    二分圖匹配實例代碼及整理

    這篇文章主要介紹了二分圖匹配實例代碼及整理的相關資料,這里提供了三種方法包括匈牙利算法,KM算法,多重匹配,需要的朋友可以參考下
    2017-07-07
  • C++抽獎程序實現方法

    C++抽獎程序實現方法

    這篇文章主要介紹了C++抽獎程序實現方法,實例分析了C++隨機數的生成技巧與抽獎程序的實現方法,需要的朋友可以參考下
    2015-07-07
  • C語言可變參數與函數參數的內存對齊詳解

    C語言可變參數與函數參數的內存對齊詳解

    這篇文章主要為大家詳細介紹了C語言可變參數與函數參數的內存對齊,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C/C++程序開發(fā)中實現信息隱藏的三種類型

    C/C++程序開發(fā)中實現信息隱藏的三種類型

    這篇文章主要介紹了C/C++程序開發(fā)中實現信息隱藏的三種類型的相關資料,需要的朋友可以參考下
    2016-02-02
  • string與char*轉換的使用詳解

    string與char*轉換的使用詳解

    本篇文章對string與char*的轉換進行的介紹。需要的朋友參考下
    2013-05-05
  • 淺談C++基類的析構函數為虛函數

    淺談C++基類的析構函數為虛函數

    本文重點:應該為多態(tài)基類聲明虛析構器。一旦一個類包含虛函數,它就應該包含一個虛析構器。如果一個類不用作基類或者不需具有多態(tài)性,便不應該為它聲明虛析構器。
    2015-10-10
  • 一篇文章教你自己動手實現C語言庫函數

    一篇文章教你自己動手實現C語言庫函數

    這篇文章主要介紹了C語言庫函數的相關資料,小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-09-09

最新評論