国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【C語言初階】操作符之 位運算符詳解(“ << ”,“ >> ”,“ & ”,“ | ”,“ ^ ”,“ ~ ”)

這篇具有很好參考價值的文章主要介紹了【C語言初階】操作符之 位運算符詳解(“ << ”,“ >> ”,“ & ”,“ | ”,“ ^ ”,“ ~ ”)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

目錄

C語言中六種位運算符:

一、位移運算符

1、移位運算符簡介

2、先要了解一點

3、 << 左移運算符

4、>>右移運算符

5、警告

二、

1、& 按位與

2、| 按位或

3、^ 按位異或

4、~ 取反

4、例子?


C語言中六種位運算符:

& 按位與

| 按位或

^ 按位異或

~取反

>>右移

<<左移

位運算符用來對二進制位進行操作,C語言中提供了如上表所示的位運算符。

位運算符中,除 ~ (取反)以外,其余均為雙目運算符。

位運算符操作數(shù)只能為整型和字符型數(shù)據(jù)。

一、位移運算符

1、移位運算符簡介

在C語言中,移位運算符有雙目移位運算符:<<(左移)和>>(右移)。

左移運算是將一個二進制位的操作數(shù)按指定移動的位數(shù)向左移動,移出位被丟棄,右邊移出的空位一律補 0 。

右移運算是將一個二進制位的操作數(shù)按指定移動的位數(shù)向右移動,移出位被丟棄,左邊移出的空位一律補 0 ,或者補符號位,這由不同的機器而定。在使用補碼作為機器數(shù)的機器中,正數(shù)的符號位為? 0 ,負數(shù)的符號位為 1 。

聽不懂是吧,接下來且聽我詳解。

2、先要了解一點

首先,要了解原碼、反碼、補碼(簡單說一下)

整數(shù)在內存中存儲的形式是補碼的二進制。

整數(shù)的二進制表示:有3種(原碼、反碼、補碼)

原碼:直接根據(jù)數(shù)值寫出的二進制序列就是原碼(32位)

反碼:原碼的符號位不變,其他位按位取反就是反碼

補碼:反碼加1,就是補碼

對于正整數(shù)的原碼、反碼、補碼都相同;負數(shù)是存放在二進制的補碼中,負整數(shù)的原碼、反碼、補碼都不相同。
?

?例如:1(正整數(shù)的原碼、反碼、補碼都相同)

原碼:0000000 00000000 00000000 00000001
 
反碼:0000000 00000000 00000000 00000001
 
補碼:0000000 00000000 00000000 00000001

最高位為0 ,也是符號位

例如:-1(負整數(shù)的原碼、反碼、補碼都相同

原碼:10000000 00000000 00000000 00000001
 
反碼:11111111 11111111 11111111 11111110(按位取反,符號位不變)
 
補碼:11111111 11111111 11111111 11111111(反碼加1)

?最高位為1,也是符號位

3、 << 左移運算符

先上代碼(只演示負整數(shù)的,看完正整數(shù)的也會了,正整數(shù)的比較簡單)

#include<stdio.h>
int main()
{
	int a = -5;
	int b = a << 1;
 
	printf("%d\n", a);
	printf("%d\n", b);
 
	return 0;
}

結果是 -10

<< >>c語言,C語言,c語言,開發(fā)語言,后端

這是為什么呢,原因如下:?

規(guī)則:左移運算是將一個二進制位的操作數(shù)按指定移動的位數(shù)向左移動,移出位被丟棄,右邊移出的空位一律補0。

簡單說就是:左邊丟棄,右邊補0

先寫出 -5 的補碼

原碼:10000000 00000000 00000000 00000101 (最高位為1)
 
反碼:11111111 11111111 11111111 11111010 (按位取反,符號位不變)
 
補碼:11111111 11111111 11111111 11111011 (反碼加1)

補碼向左移動一位,左邊去掉,右邊補0,如圖:

<< >>c語言,C語言,c語言,開發(fā)語言,后端

此時得到的是補碼,還要反推原碼才能打印

補碼:11111111 11111111 11111111 11110110
 
反碼:11111111 11111111 11111111 11110101(補碼 -1 得到反碼)
 
原碼:10000000 00000000 00000000 00001010(按位取反得到原碼)

此時得到的原碼就可以打印了,結果是 -10

注:此時的 a 沒有改變,依舊是 -5

4、>>右移運算符

先上代碼(只演示負整數(shù)的,看完正整數(shù)的也會了,正整數(shù)的比較簡單)

#include<stdio.h>
int main()
{
	int a = -5;
	int b = a >> 1;
 
	printf("%d\n", a);
	printf("%d\n", b);
 
	return 0;
}

結果是:-3

<< >>c語言,C語言,c語言,開發(fā)語言,后端

?這是為什么,原因如下:?

右移運算是將一個二進制位的操作數(shù)按指定移動的位數(shù)向右移動,移出位被丟棄,左邊移出的空位一律補0,或者補符號位,這由不同的機器而定。在使用補碼作為機器數(shù)的機器中,正數(shù)的符號位為 0 ,負數(shù)的符號位為 1 。

簡單說就是:(分為 2 種)

1. 邏輯右移
左邊用0填充,右邊丟棄。
2. 算術右移
左邊用原該值的符號位填充,右邊丟棄。

到底是邏輯右移還是算術右移取決于編譯器

我當前使用的編譯器,它采用的是算術右移

先寫出 -5 的補碼

原碼:10000000 00000000 00000000 00000101 (最高位為1)
 
反碼:11111111 11111111 11111111 11111010 (按位取反,符號位不變)
 
補碼:11111111 11111111 11111111 11111011 (反碼加1)

補碼向右移動一位,右邊丟棄,左邊補符號位,如圖:

<< >>c語言,C語言,c語言,開發(fā)語言,后端

???此時得到的是補碼,還要反推原碼才能打印

補碼:11111111 11111111 11111111 11111101
 
反碼:11111111 11111111 11111111 11111100(補碼 -1 得到反碼)
 
原碼:10000000 00000000 00000000 00000011(按位取反得到原碼)

此時得到的原碼就可以打印了,結果是 -3

注:此時的 a 沒有改變,依舊是 -5

5、警告

警告?:
對于移位運算符,不要移動負數(shù)位,這個是標準未定義的。

例如:

int a = 5;
int b = a >> -1  //error

二、

1、& 按位與

先上代碼:

#include<stdio.h>
int main()
{
	int a = 5;
	int b = -2;
	int c = a & b;
	printf("%d\n", c);

	return 0;

運行結果是:4

<< >>c語言,C語言,c語言,開發(fā)語言,后端

??這是為什么,原因如下:

規(guī)則:兩個二進制操作數(shù)對應位同為 1 ,結果位才為 1 ,其余情況為 0 。

先寫出 5,-2 的補碼

 5 的補碼:00000000 00000000 00000000 00000101

-2 的原碼:10000000 00000000 00000000 00000010
-2 的反碼:11111111 11111111 11111111 11111101
-2 的補碼:11111111 11111111 11111111 11111110

兩個二進制操作數(shù)對應位同為 1 ,結果 位 才為 1 ,其余情況為 0?

?      5 的補碼:00000000 00000000 00000000 00000101
     -2 的補碼:11111111 11111111 11111111 11111110
 5 & -2 的補碼:00000000 00000000 00000000 00000100

此時得到的是補碼,要原碼才能打印

 5 &- 2 的原碼:00000000 00000000 00000000 00000100 
 (正整數(shù)原、反、補相同)
   

此時打印結果是:4

2、| 按位或

先上代碼

#include<stdio.h>
int main()
{
	int a = 5;
	int b = -2;
	int c = a | b;
	printf("%d\n", c);

	return 0;
}

結果是:-1

<< >>c語言,C語言,c語言,開發(fā)語言,后端

???這是為什么,原因如下:

規(guī)則:兩個二進制操作數(shù)對應位只要有一個為 1 ,結果 位 就為 1 ,其余情況為 0?

先寫出 5,-2 的補碼

? 5 的補碼:00000000 00000000 00000000 00000101

-2 的原碼:10000000 00000000 00000000 00000010
-2 的反碼:11111111 11111111 11111111 11111101
-2 的補碼:11111111 11111111 11111111 11111110

兩個二進制操作數(shù)對應位只要有一個為 1 ,結果 位 就為 1 ,其余情況為 0?

      5 的補碼:00000000 00000000 00000000 00000101
     -2 的補碼:11111111 11111111 11111111 11111110
 5 | -2 的補碼:11111111 11111111 11111111 11111111

此時得到的是補碼,需要原碼才能打印

5 | -2 的補碼:11111111 11111111 11111111 11111111
5 | -2 的反碼:11111111 11111111 11111111 11111110
5 | -2 的原碼:10000000 00000000 00000000 00000001

此時打印結果是:-1

3、^ 按位異或

先上代碼

#include<stdio.h>
int main()
{
	int a = 5;
	int b = -2;
	int c = a ^ b;
	printf("%d\n", c);

	return 0;
}

結果是:-5

<< >>c語言,C語言,c語言,開發(fā)語言,后端

??這是為什么,原因如下:

規(guī)則:兩個二進制操作數(shù)對應 位 相同為 0 ,不同為 1

先寫出 5,-2 的補碼

? 5 的補碼:00000000 00000000 00000000 00000101

-2 的原碼:10000000 00000000 00000000 00000010
-2 的反碼:11111111 11111111 11111111 11111101
-2 的補碼:11111111 11111111 11111111 11111110

兩個二進制操作數(shù)對應 位 相同為 0 ,不同為 1

?      5 的補碼:00000000 00000000 00000000 00000101
     -2 的補碼:11111111 11111111 11111111 11111110
 5 ^ -2 的補碼:11111111 11111111 11111111 11111011

此時得到的是補碼,需要原碼才能打印

5 ^ -2 的補碼:11111111 11111111 11111111 11111011
5 ^ -2 的反碼:11111111 11111111 11111111 11111010
5 ^ -2 的原碼:10000000 00000000 00000000 00000101

此時打印結果是:-5

4、~ 取反

~ (取反)這是一個單目操作符,先上代碼

#include<stdio.h>
int main()
{
	int a = 5;
	int c = ~a;
	printf("%d\n", c);

	return 0;
}

?結果是:-6

<< >>c語言,C語言,c語言,開發(fā)語言,后端

??這是為什么,原因如下:

規(guī)則:一個二進制操作數(shù),對應位為 0 ,結果位為 1 ;對應位為 1 ,結果位為 0
作用是將每位二進制取反

先寫出 5 的補碼?

? 5 的補碼:00000000 00000000 00000000 00000101

?對應位為 0 ,結果位為 1 ;對應位為1,結果位為 0

? 5 的補碼:00000000 00000000 00000000 00000101
     取反:11111111 11111111 11111111 11111010

?此時得到的是補碼,需要原碼才能打印

取反后(補碼):11111111 11111111 11111111 11111010
         反碼:11111111 11111111 11111111 11111001
         原碼:10000000 00000000 00000000 00000110

此時打印的結果是:-6

4、例子?

例:不能創(chuàng)建臨時變量(第三個變量),實現(xiàn)兩個數(shù)的交換

很容易想到的代碼是兩個數(shù)相減,代碼如下:

#include <stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	a = a + b;
	b = a - b;
	a = a - b;
	printf("a = %d b = %d\n", a, b);
	return 0;
}

但是這種代碼有局限性,當 a 和 b 這兩個數(shù)很大的時候,加起來超過了 int 的范圍,代碼就失效了

另一種的方法不易想到,就是用位操作符來實現(xiàn),代碼如下:

#include <stdio.h>
int main()
{
	int a = 10;
	int b = 20;
	a = a ^ b;
	b = a ^ b;
	a = a ^ b;
	printf("a = %d b = %d\n", a, b);
	return 0;
}

為什么可以交換 a 和 b ,原因留給你自己琢磨,上面已經介紹過 ^ (按位異或)了

三、最后

文章到這就結束了,希望對你有幫助,覺得文章不錯就點個贊吧。

文章有什么問題可以留言,感謝支持!!?文章來源地址http://www.zghlxwxcb.cn/news/detail-739720.html

到了這里,關于【C語言初階】操作符之 位運算符詳解(“ << ”,“ >> ”,“ & ”,“ | ”,“ ^ ”,“ ~ ”)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • c++類與對象(二)——賦值運算符重載與取地址操作符重載

    c++類與對象(二)——賦值運算符重載與取地址操作符重載

    前言: 本章將通過 日期類 的實現(xiàn),深入學習 運算符重載 的實現(xiàn)方法。本章將完成6個默認成員函數(shù)中剩余3個—— 賦值運算符重載 與 取地址操作符重載 的學習。 C++ 為了增強代碼的可讀性引入了 運算符重載 ,運算符重載是具有 特殊函數(shù)名 的函數(shù),也具有其返回值類型,

    2024年02月03日
    瀏覽(21)
  • C++ operator關鍵字的使用(重載運算符、仿函數(shù)、類型轉換操作符)

    C++ operator的使用(重載運算符、仿函數(shù)、類型轉換操作符) C++11實用技術(一)auto與decltype的使用 C++11實用技術(二)std::function和bind綁定器 C++11實用技術(三)std::future、std::promise、std::packaged_task、async C++11 中,operator 是一個,用于重載運算符。通過重載運算符

    2024年02月14日
    瀏覽(31)
  • [C++] 類與對象(中)類中六個默認成員函數(shù)(2)-- 運算符重載 -- 取地址及const取地址操作符重載

    [C++] 類與對象(中)類中六個默認成員函數(shù)(2)-- 運算符重載 -- 取地址及const取地址操作符重載

    ? 本篇我們以日期類來展開講。對于一個日期,我們如何去比大小呢?對年月日依次進行比較可以,但是可以直接比較嗎? 我們可以看到,對于自定義類型的日期類直接去比較兩個日期的大小是錯誤的,因此我們需要對運算符賦予特殊的功能,去實現(xiàn)可以對自定義類型的比較

    2024年02月13日
    瀏覽(34)
  • 初階C語言-操作符詳解(下)

    初階C語言-操作符詳解(下)

    ?? “等春風得意,等時間嘉許!” 接下來,我們把操作符沒學完的繼續(xù)學完! ??我們來看一下下面這段代碼: 關系操作符: = = !=(用于測試不相等) ==(用于測試相等) 注:不要把 == 和 = 混起來? ? == 用于測試相等, = 用于賦值。 ??邏輯操作符: (邏輯與操作符)

    2024年02月13日
    瀏覽(21)
  • 初階C語言——詳解操作符(1)

    初階C語言——詳解操作符(1)

    Hello,我們又見面了,最近不知道大家是否在持續(xù)輸出代碼呢?代碼能力是否提高了呢?今天讓我們來一起學習操作符,操作符在我們學習語言中很重要,我們要知道每個操作符的作用和用法,下面開始我們的學習。 操作符分類: 算術操作符 移位操作符 位操作符 賦值操作符

    2024年02月12日
    瀏覽(22)
  • 初階C語言-操作符詳解(上)

    初階C語言-操作符詳解(上)

    “不飛則已,一飛沖天;不鳴則已,一鳴驚人。” 今天,我們一起來學習一下操作符的相關知識。 算術操作符 + - * / % 移位操作符 位操作符 | ^ 賦值操作符 = += -= *= /=... 單目操作符 ! sizeof ++ -- ... 關系操作符 = = == != 邏輯操作符 || 條件操作符 ? : 逗號表達式 , 下標引用、函數(shù)

    2024年02月13日
    瀏覽(21)
  • 【C語言初階】帶你輕松玩轉所有常用操作符(1) ——算數(shù)操作符,移位操作符,位操作符

    【C語言初階】帶你輕松玩轉所有常用操作符(1) ——算數(shù)操作符,移位操作符,位操作符

    君兮_的個人主頁 勤時當勉勵 歲月不待人 C/C++ 游戲開發(fā) Hello,這里是君兮_,最近要準備期末復習了,可能更新的就不會那么頻繁了,下個星期恢復正常更新。 今天給大家?guī)淼氖遣僮鞣斀猓捎谶@部分的內容比較多,可能會分成幾部分講,今天帶來的是第一部分的內容,廢

    2024年02月11日
    瀏覽(32)
  • 【C語言初階(七)】操作符詳解

    【C語言初階(七)】操作符詳解

    ??博主CSDN主頁:杭電碼農-NEO?? ? ?專欄分類:C語言學習分享? ? ??代碼倉庫:NEO的學習日記?? ? ??關注我??帶你學習更多C語言知識 ? ???? 我們已經在了解C語言的內一章節(jié)熟悉了所有的操作符了解C語言.其實操作符還有一些更細節(jié)更有用的延申內容,本章就給大家?guī)?/p>

    2024年02月09日
    瀏覽(43)
  • 【C語言初階(16)】操作符2

    【C語言初階(16)】操作符2

    在 C 語言中,使用關系操作符來判斷兩個數(shù)之間的大小關系。 關系運算符都是雙目運算符 ,其結合性均為從左到右。 關系運算符的優(yōu)先級低于算術運算符,高于賦值運算符。 邏輯運算符獲得的是一個邏輯值, 邏輯值只有 “ 真 ” 或 “ 假 ”兩種狀態(tài) 。 運算符 含義 優(yōu)先級

    2024年02月16日
    瀏覽(65)
  • 【初階C語言】操作符1--對二進制的操作

    【初階C語言】操作符1--對二進制的操作

    前言:本節(jié)內容介紹的操作符,操作的對象是二進制位。所以前面先介紹整數(shù)的二進制位 1.二進制介紹 (1)整數(shù)的二進制表示形式有三種:原碼、反碼和補碼。 (2)原碼、反碼和補碼的長度有數(shù)據(jù)類型來決定,如整數(shù),就是四個字節(jié),轉化后是三十二位比特位,所以一個整

    2024年02月09日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包