亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

深入理解C++移位運算符

2020-05-23 14:03:28
字體:
來源:轉載
供稿:網友
下面小編就為大家帶來一篇深入理解C++移位運算符。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
 

關于邏輯移位、算術移位可參見迅雷深大筆試題部分。的一道題。

以前看到C++標準上說,移位運算符(<<、>>)出界時的行為并不確定:

The behavior is undefined if the right operand is negative, orgreater than or equal to the length in bits of the promoted left operand.

我當時也沒有深究過這個問題。前幾天有個網友來信問起這件事,我才發現,這和IntelCPU的移位運算有關。下面是那位網友的來信以及我的回復:

您好!運算符<<作為位操作中的高效的操作,但我遇到一個問題:下面在VC環境下發現一個很不明白的地方,下面標注。

#include <stdio.h>

void main(){  unsigned int i,j;  i=35;   //為什么下面兩個左移操作結果不一樣?  j=1<<i; // j為8  j=1<<35; // j為0}

不知是哪里沒有理解對。

原因是這樣的:i=35;j=1<<i;這兩句在VC沒有做優化的情況下,將被編譯成下面的機器指令:

mov dword ptr [i],23h

mov eax,1

mov ecx,dword ptr [i]

shl eax,cl

mov dword ptr [j],eax

在shl一句中,eax=1,cl=35。而IntelCPU執行shl指令時,會先將cl與31進行and操作,以限制左移的次數小于等于31。因為35 & 31 =3,所以這樣的指令相當于將1左移3位,結果是8。

而j=1<<35;一句是常數運算,VC即使不做優化,編譯器也會直接計算1<<35的結果。VC編譯器發現35大于31時,就會直接將結果設置為0。這行代碼編譯產生的機器指令是:

mov dword ptr [j],0

對上面這兩種情況,如果把VC編譯器的優化開關打開(比如編譯成Release版本),編譯器都會直接將結果設置為0。

所以,在C/C++語言中,移位操作不要超過界限,否則,結果是不可預期的。

http://hovertree.com/menu/cpp/

下面是Intel文檔中關于shl指令限制移位次數的說明:

The destination operand can be a register or a memory location.The count operand can be an immediate value or register CL. The count is maskedto 5 bits, which limits the count range to 0 to 31. A special opcode encodingis provided for a count of 1.

1.掩碼

就是一串2進制 對目標字段進行位與運算,屏蔽當前的輸入位。

將源碼與掩碼經過邏輯運算得出新的操作數。其中要用到邏輯運算如OR運算。AND運算。用于如將ASCLL碼中大寫字母改作小寫字母。

2.與 或 異或 轉換成補碼運算

3.  用法:掩碼 (&)

4. 用法:打開位 (|)

5.用法:關閉位 (&~)

6. 用法:轉置位 (^)

7. 將Value的第bit_number位置1       Value |= 1 << bit_number;

8. 將Value的第bit_number位置0       Value &= ~( 1 << bit_number );

9.value & 1 << bit_number 如果該位置已被置為1,則表達式的結果為非零值

C/C ++提供位邏輯運算符和移位運算符。二者只能用于整形和字符型。位運算符是對每位進行操作而不影響左右兩位,這有別于常規運算符(&&|| !)是將整個數進行操作的。

一.    位邏輯運算符

1.    ~ 按位取反

將1變為0,將0變為1

EG:

~(10011010)

(01100101)

注:

VC++編譯器,計算~10,得出的結果是-11。為什么不是5呢

10的二進制表示為1010,按位取反應該為0101,也就是十進制的5,為什么會得出-11?

VC是32位編譯器,所以

10 = 00000000 00000000 00000000   00001010

~10 = 11111111 11111111   11111111   11110101 =   -11

可以通過掩碼(位與) 與15位與

   15 = 00000000 00000000 00000000   00001111

~10 = 00000000 00000000 00000000   00000101   =   -11

2.    & 按位取與

只有兩個操作數都是1結果才是1,否則為0

10 = 00000000 00000000 00000000   00001010

12 = 00000000 00000000 00000000   00001100

&

8 = 00000000 00000000 00000000   00001000

3.    | 按位取或

兩個操作數任意一位為1結果就是1

10 = 00000000 00000000 00000000   00001010

12 = 00000000 00000000 00000000   00001100

|

14 = 00000000 00000000 00000000   00001110

4.    ^ 按位異或

兩個操作數不同為1,相同為0

10 = 00000000 00000000 00000000   00001010

12 = 00000000 00000000 00000000   00001100

^

14 = 00000000 00000000 00000000   00000110

5.    用法:掩碼

掩碼是通過&(位與)將某些位設置為開(1),將某些位設置為關(0)。將掩碼0看做不透明,將1看著透明。

EG:

如只顯示第二、三位

107 = 0110 1011

6            = 0000 0110

&

2   = 0000 0010

       

6.    用法:打開位

打開位是通過 |(位或)打開一個值的特定位,同時保持其他位的不變。這是因為和0位或都為0,和1位或都為1。

EG:

如只打開第二、三位

107 = 0110 1011

6   = 0000 0110

|

111 = 0110 1111

7.    用法:關閉位

關閉某些位

EG:

如關閉第二、三位

107 = 0110 1011

6    = 0000 0110

& ~

105 = 0110 1001

8.    用法:轉置位

如果一位為1則轉置為0,如果一位為1則轉置為0

EG:

如轉置第二、三位

107 = 0110 1011

6    = 0000 0110

^

105 = 0110 1101

       

二.    移位運算符

  1. << 左移

左移運算符是把操作數的值的每一位向左移動,移動的位數有右邊的操作數決定,右側空出的位數用0填充

EG:

如轉置第二、三位

107 = 0110 1011 <<2

<<

172 = 1010 1100

      

       在計算機中由于是32位的

107 = 0000 0000   0000 0000   0000 0000   0110 1011 <<2

<<

428 = 0000 0000   0000 0000   0000 0001   1010 1100

  1. >> 右移

右移運算符是把操作數的值的每一位向右移動,移動的位數有右邊的操作數決定,左邊丟棄的位數用0填充

EG:

如轉置第二、三位

107 = 0110 1011 >>2

>>

26 = 0001 1010

一、傳統的C方式位操作:

1.基本操作:

   使用一個unsigned int變量來作為位容器。

2.操作符:

|   按位或操作符:result=exp1|exp2;當exp1和exp2中對應位中至少有一個為1時,result中對應位為1,否則為0。

&  按位與操作符::result=exp1&exp2;當exp1和exp2中對應位全為1時,result中對應位為1,否則為0。

^  按位異或或操作符:result=exp1^exp2;當exp1和exp2中對應位不相同時,result中對應位為1,否則為0。

~  反轉操作符:將位容器中的所有位都反轉,1變為0,0變為1。

<< 按位左移操作符:exp<<n,將容器中所有的位向左移n位,空出的位用0填充。

>> 按位右移操作符:exp>>n,將容器中所有的位向右移n位,空出的位用0填充。

|=,&=,^= 分別對應|&^三種操作符的復合操作符。

3.常用操作

   這里我們假設有一個result的unsigned int變量用來儲存32個學生的成績(通過和不通過分別用0和1),這樣result就有33位(result從右至左,從0開始計算位數,在這個例子中0位被浪費)。

(a) 將第27位設置為及格(設作1)其他位不變:

   result|=(1<<27) //任意的位值與1作按位或操作其值為1,而與0作按位與操作其值不變

(b) 將第27位設置成不及格(設為0)。

   result&=~(1<<27) //任意的位值與0作按位與操作其值為0,而與1作按位與操作其值不變

(c) 反轉第27位的值。

   result^=(1<<27) //任意的位值與1作按位異或操作其值為1,而與0作按位異與操作其值不變

二、C++中的bitset容器

1.頭文件:

  #include <bitset>

2.聲明一個容器:

 (a)聲明一個指定位數的空容器(所有位設為0): bitset<int> bits;

 (b)聲明一個指定位數并將指定的幾個位初始化為相應值的容器: bitset<n> bits(int);

     bitdet<int> bits(string&)

總結:bitset模板類中類型參數傳遞容器的位數,而構造函數參數通過一個int或一個string&值來從右至左初始化容器中的相應值。

3.bitset的基本用法:

 

操作

功能

用法

test(pos)

pos位是否為1?

a.test(4)

any()

任意位是否為1?

a.any()

none()

是否沒有位為1?

a.none()

count()

值是1的位的小數

count()

size()

位元素的個數

size()

[pos]

訪問pos位

a[4]

flip()

翻轉所有位

a.flip()

flip(pos)

翻轉pos位

a.flip(4)

set()

將所有位置1

a.set()

set(pos)

將pos位置1

a.set(4)

reset()

將所有位置0

a.reset()

reset(pos)

將pos位置0

a.reset(4)

 

4.bitset與傳統C位操作及字符串的轉換

   可以通過to_string()成員將容器轉輸出為一個string字符串,另外還可以用to_long()成員將容器輸出到傳統的用于C風格的位容器中。如:

  unsigned long bits = bits.to_long();

  sting str(bits.to_string());

以上這篇深入理解C++移位運算符就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VEVB武林網。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
疯狂做受xxxx欧美肥白少妇| 亚洲天天在线日亚洲洲精| 色婷婷成人综合| 久久人人爽人人爽人人片av高请| 久久99热这里只有精品国产| 国产在线拍揄自揄视频不卡99| 欧美一二三视频| 国产精品91免费在线| 91精品国产91久久久久久不卡| 中文字幕在线观看亚洲| 久青草国产97香蕉在线视频| 久久人体大胆视频| 国产精品一区二区久久国产| 欧美成人免费在线视频| 欧美国产激情18| 国精产品一区一区三区有限在线| 最近日韩中文字幕中文| 亚洲国产成人久久综合| 日本不卡视频在线播放| 一区二区在线视频播放| 性欧美视频videos6一9| 欧美成年人视频网站| 国产日韩换脸av一区在线观看| 国产精品日日做人人爱| 国产91成人video| 人人爽久久涩噜噜噜网站| 欧美激情视频三区| 国语自产精品视频在线看| 亚洲欧美制服第一页| 欧美午夜丰满在线18影院| 国内精品免费午夜毛片| 国产成人97精品免费看片| 亚洲自拍偷拍区| 日韩亚洲欧美中文在线| 欧美午夜久久久| 久久男人av资源网站| 色妞久久福利网| 欧美日韩成人精品| 精品成人69xx.xyz| 91精品久久久久久综合乱菊| 国产成人亚洲综合91| 久久久久亚洲精品成人网小说| 亚洲成人1234| 成人综合国产精品| 九色精品美女在线| 国产精品午夜视频| 亚洲自拍偷拍福利| 中文字幕亚洲欧美日韩高清| 欧美午夜精品久久久久久浪潮| 久久国产精品久久久久久久久久| 久久久午夜视频| 精品少妇一区二区30p| 欧美中文在线视频| 国产精品久久久久77777| 精品国产精品自拍| 伊人久久男人天堂| 97超视频免费观看| 久久免费视频观看| 69av在线视频| 中文字幕av一区中文字幕天堂| 青草热久免费精品视频| 福利视频第一区| 成人精品久久av网站| 一本色道久久综合狠狠躁篇怎么玩| 成人免费在线视频网址| 久久99久久亚洲国产| 国产精品久久久久久影视| 成人a免费视频| 欧美另类老女人| 亚洲综合在线播放| 色综合天天综合网国产成人网| 亚洲国产精品va在线看黑人| 日韩精品亚洲元码| 国产日本欧美一区二区三区在线| 国产成人综合一区二区三区| 91国内产香蕉| 国产亚洲精品一区二555| 日本aⅴ大伊香蕉精品视频| 98午夜经典影视| 精品日韩中文字幕| 亲子乱一区二区三区电影| 国产成人精品av| 日本久久久久久| 亚洲色图欧美制服丝袜另类第一页| 日韩免费不卡av| 亚洲免费视频观看| 国产成人精品免费久久久久| 亚洲精品国产精品国自产观看浪潮| 欧美日韩国产一区二区三区| 久久夜色精品国产亚洲aⅴ| 麻豆国产精品va在线观看不卡| 国产精品福利小视频| 亚洲精品日韩欧美| 欧美激情手机在线视频| 亚洲人免费视频| 亚洲人av在线影院| 97国产精品人人爽人人做| 久久99久久99精品免观看粉嫩| 久久香蕉国产线看观看av| 亚洲japanese制服美女| 黑人巨大精品欧美一区二区三区| 欧美中文字幕在线播放| 欧美成人在线网站| 久久在线视频在线| 欧美另类在线播放| 久久精品电影一区二区| 国产精品美女久久久久av超清| 91精品国产自产在线观看永久| 国产亚洲一区二区在线| 欧美激情久久久久| 久久人人97超碰精品888| 国产精品青青在线观看爽香蕉| 国产精品美女无圣光视频| 清纯唯美亚洲激情| 1769国产精品| 亚洲欧美综合精品久久成人| 国产精品毛片a∨一区二区三区|国| 欧美激情一级精品国产| 欧美日韩国产在线| 日韩少妇与小伙激情| 欧美午夜宅男影院在线观看| www.欧美三级电影.com| 国产盗摄xxxx视频xxx69| 国内精品久久久久久久| 亚洲tv在线观看| 亚洲精品视频在线播放| 成人国产在线激情| 亚洲视频在线视频| 中文在线资源观看视频网站免费不卡| 国产网站欧美日韩免费精品在线观看| 欧美一区二粉嫩精品国产一线天| 午夜精品久久久99热福利| 尤物九九久久国产精品的分类| 91精品综合久久久久久五月天| 日韩精品免费在线播放| 欧美激情精品久久久久| 高清一区二区三区四区五区| 国语自产在线不卡| 国产精品电影网站| 欧美午夜精品久久久久久人妖| 黑人巨大精品欧美一区免费视频| 国产在线视频91| 久久精品国亚洲| 国产精品女视频| 国产精品自产拍在线观看中文| 91福利视频网| 国产精品电影一区| 日韩国产高清污视频在线观看| 亚洲精品一区中文| 亚洲图片在线综合| 亚洲成人网久久久| 成人激情视频在线播放| 欧美极品美女电影一区| 久久欧美在线电影| 亚洲一区二区三区久久| 成人免费视频网| 国产精品直播网红| 亚洲国产精品成人av| 中文字幕欧美日韩在线| 国产精品视频自在线| 欧美日韩视频免费播放| 日韩资源在线观看| 91性高湖久久久久久久久_久久99| 亚洲欧洲免费视频|