>n;}intmain(){//leftshiftchara1=127;chara2=-1;for(inti=1;i<=8;i++)printf("%" />

黄色网页视频 I 影音先锋日日狠狠久久 I 秋霞午夜毛片 I 秋霞一二三区 I 国产成人片无码视频 I 国产 精品 自在自线 I av免费观看网站 I 日本精品久久久久中文字幕5 I 91看视频 I 看全色黄大色黄女片18 I 精品不卡一区 I 亚洲最新精品 I 欧美 激情 在线 I 人妻少妇精品久久 I 国产99视频精品免费专区 I 欧美影院 I 欧美精品在欧美一区二区少妇 I av大片网站 I 国产精品黄色片 I 888久久 I 狠狠干最新 I 看看黄色一级片 I 黄色精品久久 I 三级av在线 I 69色综合 I 国产日韩欧美91 I 亚洲精品偷拍 I 激情小说亚洲图片 I 久久国产视频精品 I 国产综合精品一区二区三区 I 色婷婷国产 I 最新成人av在线 I 国产私拍精品 I 日韩成人影音 I 日日夜夜天天综合

位運(yùn)算之左移右移運(yùn)算

系統(tǒng) 3754 0

位運(yùn)算之左移右移運(yùn)算之詳解

先看如下一段左移右移的代碼及其結(jié)果:

代碼
          
#include " stdio.h " char leftshift( char i, int n) { if (n < 0 ) return - 1 ; return i << n; } char rightshift( char i, int n) { if (n < 0 ) return - 1 ; return i >> n; } int main() { // leftshift char a1 = 127 ; char a2 = - 1 ; for ( int i = 1 ; i <= 8 ; i ++ ) printf( " %d<<%d = %d;\n " , a1, i, leftshift(a1,i)); for (i = 1 ; i <= 8 ; i ++ ) printf( " %d<<%d = %d;\n " , a2, i, leftshift(a2,i)); // rightshift a1 = 127 ; a2 = - 128 ; for (i = 1 ; i <= 8 ; i ++ ) printf( " %d>>%d = %d;\n " , a1, i, rightshift(a1,i)); for (i = 1 ; i <= 8 ; i ++ ) printf( " %d>>%d = %d;\n " , a2, i, rightshift(a2,i)); return 0 ; }

結(jié)果為:

結(jié)果
          
127 << 1 = - 2 ; 127 << 2 = - 4 ; 127 << 3 = - 8 ; 127 << 4 = - 16 ; 127 << 5 = - 32 ; 127 << 6 = - 64 ; 127 << 7 = - 128 ; 127 << 8 = 0 ; - 1 << 1 = - 2 ; - 1 << 2 = - 4 ; - 1 << 3 = - 8 ; - 1 << 4 = - 16 ; - 1 << 5 = - 32 ; - 1 << 6 = - 64 ; - 1 << 7 = - 128 ; - 1 << 8 = 0 ; 127 >> 1 = 63 ; 127 >> 2 = 31 ; 127 >> 3 = 15 ; 127 >> 4 = 7 ; 127 >> 5 = 3 ; 127 >> 6 = 1 ; 127 >> 7 = 0 ; 127 >> 8 = 0 ; - 128 >> 1 = - 64 ; - 128 >> 2 = - 32 ; - 128 >> 3 = - 16 ; - 128 >> 4 = - 8 ; - 128 >> 5 = - 4 ; - 128 >> 6 = - 2 ; - 128 >> 7 = - 1 ; - 128 >> 8 = - 1 ;

左移操作(<<)
規(guī)則:
右邊空出的位用0填補(bǔ)
高位左移溢出則舍棄該高位。
計算機(jī)中常用補(bǔ)碼表示數(shù)據(jù):
數(shù)據(jù) 127,補(bǔ)碼和原碼一樣:0111 1111。
左移一位: 1111 1110 -> 這個補(bǔ)碼對應(yīng)的原碼為:1000 0010 對應(yīng)十進(jìn)制:-2
左移二位: 1111 1100 -> 這個補(bǔ)碼對應(yīng)的原碼為:1000 0100 對應(yīng)十進(jìn)制:-4
左移三位: 1111 1000 -> 這個補(bǔ)碼對應(yīng)的原碼為:1000 1000 對應(yīng)十進(jìn)制:-8
左移四位: 1111 0000 -> 這個補(bǔ)碼對應(yīng)的原碼為:1001 0000 對應(yīng)十進(jìn)制:-16
左移五位: 1110 0000 -> 這個補(bǔ)碼對應(yīng)的原碼為:1010 0000 對應(yīng)十進(jìn)制:-32
左移六位: 1100 0000 -> 這個補(bǔ)碼對應(yīng)的原碼為:1100 0000 對應(yīng)十進(jìn)制:-64
左移七位: 1000 0000 -> 這個補(bǔ)碼對應(yīng)的原碼為:1000 0000 對應(yīng)十進(jìn)制:-128
左移八位: 0000 0000 -> 這個補(bǔ)碼對應(yīng)的原碼為:0000 0000 對應(yīng)十進(jìn)制:0
注:
原碼到補(bǔ)碼的計算方式:取反+1,
補(bǔ)碼到原碼的計算方式:-1再取反。
數(shù)據(jù)-1,它的原碼為1000 0001,補(bǔ)碼為1111 1111
左移一位: 1111 1110 -> 這個補(bǔ)碼對應(yīng)的原碼為:1000 0010 對應(yīng)十進(jìn)制:-2
左移二位: 1111 1100 -> 這個補(bǔ)碼對應(yīng)的原碼為:1000 0100 對應(yīng)十進(jìn)制:-4
左移三位: 1111 1000 -> 這個補(bǔ)碼對應(yīng)的原碼為:1000 1000 對應(yīng)十進(jìn)制:-8
左移四位: 1111 0000 -> 這個補(bǔ)碼對應(yīng)的原碼為:1001 0000 對應(yīng)十進(jìn)制:-16
左移五位: 1110 0000 -> 這個補(bǔ)碼對應(yīng)的原碼為:1010 0000 對應(yīng)十進(jìn)制:-32
左移六位: 1100 0000 -> 這個補(bǔ)碼對應(yīng)的原碼為:1100 0000 對應(yīng)十進(jìn)制:-64
左移七位: 1000 0000 -> 這個補(bǔ)碼對應(yīng)的原碼為:1000 0000 對應(yīng)十進(jìn)制:-128
左移八位: 0000 0000 -> 這個補(bǔ)碼對應(yīng)的原碼為:0000 0000 對應(yīng)十進(jìn)制:0
可以看出127和-1的結(jié)果完全一樣。移位操作與正負(fù)數(shù)無關(guān),它只是忠實(shí)的將所有位進(jìn)行移動,補(bǔ)0,舍棄操作。
右移操作(>>)
規(guī)則:

左邊空出的位用0或者1填補(bǔ)。正數(shù)用0填補(bǔ),負(fù)數(shù)用1填補(bǔ)。注:不同的環(huán)境填補(bǔ)方式可能不同;

低位右移溢出則舍棄該位。

1、127的補(bǔ)碼:0111 1111

右移一位: 0011 1111 -> 原碼同補(bǔ)碼一樣 對應(yīng)十進(jìn)制:63

右移二位: 0001 1111 -> 原碼同補(bǔ)碼一樣 對應(yīng)十進(jìn)制:31

右移三位: 0000 1111 -> 原碼同補(bǔ)碼一樣 對應(yīng)十進(jìn)制:15

右移四位: 0000 0111 -> 原碼同補(bǔ)碼一樣 對應(yīng)十進(jìn)制:7

右移五位: 0000 0011 -> 原碼同補(bǔ)碼一樣 對應(yīng)十進(jìn)制:3

右移六位: 0000 0001 -> 原碼同補(bǔ)碼一樣 對應(yīng)十進(jìn)制:1

右移七位: 0000 0000 -> 原碼同補(bǔ)碼一樣 對應(yīng)十進(jìn)制:0

右移八位: 0000 0000 -> 原碼同補(bǔ)碼一樣 對應(yīng)十進(jìn)制:0

2、-128的補(bǔ)碼:1000 0000

右移一位: 1100 0000 -> 這個補(bǔ)碼對應(yīng)的原碼為:1100 0000 對應(yīng)十進(jìn)制:-64

右移二位: 1110 0000 -> 這個補(bǔ)碼對應(yīng)的原碼為:1010 0000 對應(yīng)十進(jìn)制:-32

右移三位: 1111 0000 -> 這個補(bǔ)碼對應(yīng)的原碼為:1001 0000 對應(yīng)十進(jìn)制:-16

右移四位: 1111 1000 -> 這個補(bǔ)碼對應(yīng)的原碼為:1000 1000 對應(yīng)十進(jìn)制:-8

右移五位: 1111 1100 -> 這個補(bǔ)碼對應(yīng)的原碼為:1000 0100 對應(yīng)十進(jìn)制:-4

右移六位: 1111 1110 -> 這個補(bǔ)碼對應(yīng)的原碼為:1000 0010 對應(yīng)十進(jìn)制:-2

右移七位: 1111 1111 -> 這個補(bǔ)碼對應(yīng)的原碼為:1000 0001 對應(yīng)十進(jìn)制:-1

右移八位: 1111 1111 -> 這個補(bǔ)碼對應(yīng)的原碼為:1000 0001 對應(yīng)十進(jìn)制:-1

常見應(yīng)用
左移相當(dāng)于*2,只是要注意邊界問題。如char a = 65; a<<1 按照*2來算為130;但有符號char的取值范圍-128~127,已經(jīng)越界,多超出了3個數(shù)值,所以從-128算起的第三個數(shù)值-126才是a<<1的正確結(jié)果。
而右移相當(dāng)于除以2,只是要注意移位比較多的時候結(jié)果會趨近去一個非常小的數(shù),如上面結(jié)果中的-1,0。
其它的四種位運(yùn)算:
與運(yùn)算(&)
1、與0相與可清零
2、與1相與可保留原值
或運(yùn)算(|)
1、與0相或可保留原值
2、與1相與可齊設(shè)1
異或運(yùn)算(^)
1、與0異或保留原值
2、與1異或比特值反轉(zhuǎn)
3、可通過某種算法,使用異或?qū)崿F(xiàn)交換兩個值
異或運(yùn)算是有結(jié)合律的
取反(~)

位運(yùn)算之左移右移運(yùn)算


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論