青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

c++按位操作符

Posted on 2008-08-05 17:51 RichardHe 閱讀(1187) 評論(0)  編輯 收藏 引用 所屬分類: [再轉]

顧名思義,按位運算符允許按照位來操作整型變量。可以把按位運算符應用于任意signed和unsigned整型,包括char類型。但是,它們通常應用于不帶符號的整型。

這些運算符的一個常見應用是在整型變量中使用單個的位存儲信息。例如標記,它用于描述二進制狀態指示符。可以使用一個位來描述有兩個狀態的值:開或關、男或女,真或假。

也可以使用按位運算符處理存儲在一個變量中的幾個信息項。例如,顏色值常常記錄為三個八位值,分別存儲顏色中紅、綠和藍的強度。這些常常保存到四字 節變量中的三個字節。第四個字節也不會浪費,包含表示顏色透明度的值。顯然,要處理各個顏色成分,需要從變量中分離出各個字節,按位運算符就可以做到這一 點。

再看另外一個例子,假定需要記錄字體的信息,那么,只要存儲每種字體的樣式和字號,以及字體是黑體還是斜體,就可以把這些信息都存儲在一個二字節的整型變量中,如圖3-1所示。

圖3-1 把字體數據存儲在2個字節中

可以使用一位來記錄字體是否為斜體—— 1表示斜體,0表示一般。同樣,用另一位來指定字體是否為黑體。使用一個字節可以從多達256種不同的樣式中選擇一個,再用另外5位記錄最多32磅的字 號。因此,在一個16位的字中,可以記錄四個不同的數據項。按位運算符提供了訪問和修改整數中單個位和一組位的便利方式,能方便地組合和分解一個16位的 字。

3.3.1 移位運算符

移位運算符可以把整型變量中的內容向左或向右移動指定的位數。移位運算符和其他按位運算符一起使用,可以獲得前面描述的結果。>>運算符把位向右移動,<<運算符把位向左移動,移出變量兩端的位被舍棄。

所有的按位操作都可以處理任何類型的整數,但本章的例子使用16位的變量,使例子較為簡單。用下面的語句聲明并初始化一個變量number:

unsigned short number=16387U;

如第2章所述,不帶符號的字面量應在數字的最后添加字母U或u。

在下面的語句中,對這個變量的內容進行移位,并存儲結果:

unsigned short result = number <<2; //Shift left two bit positions

移位運算符的左操作數是要移位的值,右操作數指定要移動的位數。圖3-2列出了該操作的過程。

圖3-2 移位運算

從圖3-2可以看出,把數值16387向左移動兩位,得到數值12。數值的這種劇烈變化是舍棄高位數字的結果。

把數值向右移動,可以使用下面的語句:

result = number >>2; //Shift right two bit positions

把數值16387向右移動兩位,得到數值4096。向右移動兩位相當于使該數值除以4。

只要沒有舍棄位,向左移動n位就相當于把該數值乘以2的n次方。換言之,就等于把該數值乘以2n。同樣,向右移動n位就相當 于把該數值除以2的n次方。但要注意,變量number向左移位時,如果舍棄了重要的位,結果就不是我們希望的那樣了。可是,這與乘法運算并沒有不同。如 果把2字節的數值乘以4,就會得到相同的結果,所以向左移位和相乘仍是等價的。出現問題的原因是相乘的結果超出了2字節整數的取值范圍。

如果需要修改原來的值,可以使用op= 賦值運算符。在這種情況下,可以使用>>=或<<=運算符。例如:

number >>= 2; // Shift contents of number two positions to the right

這等價于:

number =number >> 2; // Shift contents of number two positions to the right

這些移位運算符跟前面用于輸入輸出的插入和提取運算符有可能搞混。從編譯器的角度來看,其含義一般可以從上下文中判斷出來。否則,編譯器就會生成一個消息,但用戶需要非常小心。例如,如果輸出變量number向左移動兩位的結果,就應編寫下面的代碼:

cout << (number << 2);

其中,括號是必不可少的。沒有括號,編譯器就會把移位運算符解釋為流插入運算符,從而得不到想要的結果。

按位移動帶符號的整數

可以把移位運算符應用于帶符號和不帶符號的整型數。但是,向右移位運算符在帶符號整數類型的操作隨系統的不同而不同,這取決于編譯器的實現。在一些情況下,向右移位運算符會在左邊空出來的位上填充0。在其他情況下,符號位向右移動,在左邊空出來的位上填充1。

移動符號位的原因是為了保持向右移位和除法運算的一致性。可以用char類型的變量來說明這一點,解釋其工作原理。假定把value定義為char類型,其初始值為–104(十進制):

signed char value=–104;

其二進制表示為10011000。使用下面的操作把它向右移動兩位:

value >>= 2; //Result 11100110

注釋中顯示了其二進制結果。右邊溢出了兩個0,因為符號位是1,就在左邊空出來的位上填充1。該結果的十進制表示是–26,這正好是value的值除以4的結果。當然,對于不帶符號的整數類型的操作,符號位不移動,在左邊空出來的位上填充0。

前面說過,在向右移位負整數時,其操作是已定義好的,所以實現該操作時不一定要依賴它。因為在大多數情況下,使用這些運算符是為了進行按位操作,此時維護位模式的完整性是非常重要的。所以,應總是使用不帶符號的整數,以確保避免高階位的移位。

3.3.2 位模式下的邏輯運算

修改整數值中的位時,可以使用4個按位運算符,如表3-1所示。

表3-1 按位運算符

運 算 符

說 明

~

這是按位求反運算符。它是一個一元運算符,可以反轉操作數中的位,即1變成0,0變成1

&

這是按位與運算符,它對操作數中相應的位進行與運算。如果相應的位都是1,結果位就是1,否則就是0

^

這是按位異或運算符,它對操作數中相應的位進行異或運算。如果相應的位各不相同,例如一個位是1,另一個位是0,結果位就是1。如果相應的位相同,結果位就是0

|

這是按位或運算符,它對操作數中相應的位進行或運算。如果兩個對應的位中有一個是1,結果位就是1。如果兩個位都是0,結果就是0

 

表3-1中的運算符按照其優先級排列,在這個集合中,按位求反運算符的優先級最高,按位或運算符的優先級最低。在附錄D的運算符優先級表中,按位移動運算符<<和>>具有相同的優先級,它們位于~運算符的下面,&運算符的上面。

如果以前沒有見過這些運算符,就會問“這非常有趣,但這是為什么?”。下面就將它們用于實踐。

1. 使用按位與運算符

按位與運算符一般用于選擇整數值中特定的一個位或一組位。為了說明這句話的含義,下面再次使用本節開頭的例子,利用一個16位整數存儲字體的特性。

假定聲明并初始化一個變量,指定一種12磅字號、斜體、樣式為6的字體。實際上,就是圖3-1中的字體。樣式的二進制值是00000110,斜體位 是1,黑體位是0,字號是01100。還有一個沒有使用的位,需要把font變量的值初始化為二進制數0000 0110 0100 1100。

由于4位二進制數對應于一個16進制數,因此最簡單的方法是以十六進制方式指定初 始值:

unsigned short font=0x064C; // Style 6, italic, 12 point

注釋:

在建立像這樣的位模式時,十六進制表示法要比十進制表示法更合適。

要使用字號,需要從font變量中提取它,這可以使用按位與運算符來實現。只有當兩個位都是1時,按位與運算符才會產生1,所以可以定義一個值,在 將定義字號的位和font執行按位與操作時選擇該位。為此,只需定義一個值,該值在我們感興趣的位上包含1,在其他位上包含0。這種值稱為掩碼,用下面的 語句定義它:

unsigned short size_mask=0x1F; //Mask is 0000 0000 0001 1111

//to select size

font變量的5個低位表示其字號,把這些位設置為1,剩余的位設置為0,這樣它們就會被舍棄(二進制數0000 0000 0001 1111可轉換為十六進制數1F)。

現在可以用下面的語句提取font中的字號了:

unsigned short size=font & size_mask;

在&操作中,當兩個對應的位是1時,結果位就是1。任何其他組合起來的結果就是0。因此組合起來的值如下:

font 0000 0110 0100 1100

size_mask 0000 0000 0001 1111

font & size_mask 0000 0000 0000 1100

把二進制值分解為4位一組的形式并不是很重要,這只是易于表示對應的十六進制數,看出其中有多少位。掩碼的作用是把最右邊的5位分隔出來,這5位表示點數(即字號)。

可以使用同樣的方法選擇字體的樣式,只是還需要使用按位移動運算符把樣式值向右移動。可以用下面的語句定義一個掩碼,選擇左邊的8位,如下所示:

unsigned short style_mask=0xFF00; //Mask is 1111 1111 0000 0000

//for style

用下面的語句獲取樣式值:

unsigned short style=(font & style_mask) >> 8; //Extract the style

該語句的結果如下:

font 0000 0110 0100 1100

style_mask 1111 1111 0000 0000

font & style_mask 0000 0110 0000 0000

(font & style_mask) >> 8 0000 0000 0000 0110

為表示斜體和黑體的位定義掩碼,并把相應的位設置為1,就很容易把它們分隔出來。當然,還需要一種方式來測試得到的位,這部分內容詳見第4章。

按位與運算符的另一個用途是關閉位。前面介紹的是掩碼中為0的位在結果中也將輸出0。例如,為了關閉表示斜體的位,其他的位不變,只需定義一個掩 碼,使該掩碼中的斜體位為0,其他位為1,再對font變量和該掩碼進行按位與操作即可。實現此操作的代碼將在按位或運算符一節中介紹。

2. 使用按位或運算符

可以使用按位或運算符設置一個或多個位。繼續操作前面的font變量,現在需要設置斜體和黑體位。用下面的語句可以定義掩碼,選擇這些位:

unsigned short italic=0x40U; //Seventh bit from the right

unsigned short bold=0x20U; //Sixth bit from the right

用下面的語句設置黑體位:

font |= bold; // Set bold

位的組合如下:

font 0000 0110 0100 1100

bold 0000 0000 0010 0000

font | bold 0000 0110 0110 1100

現在,font變量指定它表示的字體是黑體和斜體。注意這個操作會設置位,而不考慮以前的狀態。如果以前位的狀態是開,則現在仍保持開的狀態。

也可以對掩碼執行按位或操作,設置多個位。下面的語句就同時設置了黑體和斜體:

font |= bold | italic; //Set bold and italic

該語言很容易讓人選擇錯誤的運算符。“設置斜體和黑體”很容易讓人覺得應使用&運算符,而這是錯誤的。對兩個掩碼執行按位與操作會得到一個所有位都是0的值,這不會改變字體的任何屬性。

如上一節最后所述,可以使用&運算符關閉位。也就是定義一個掩碼,把其中要關閉的位設置為0,其他位設置為1。但如何指定這樣的掩碼?如果 要顯式指定它,就需要知道變量中有多少個字節,如果希望程序可以任何方式移植,這就不很方便。可是,在通常用于打開位的掩碼上使用按位求反運算符,就可以 得到這樣的掩碼。在bold掩碼上關閉黑體位,就可以得到該掩碼:

bold 0000 0000 0010 0000

~bold 1111 1111 1101 1111

按位求反運算符的作用是反轉原數值中的每一位,使0變成1,1變成0。無論bold變量占用2個字節、4個字節還是8個字節,這都會生成我們期望的結果。

提示:

按位求反運算符有時稱為NOT運算符,因為對于它操作的每個位,都會得到跟開始不同的值。

因此,在關閉黑體位時,只需對掩碼bold的反碼和font變量執行按位與操作,可用的語句如下所示:

font &= ~bold; //Turn bold off

還可以使用&運算符把幾個掩碼組合起來,再對結果跟要修改的變量執行按位與操作,將多個位設置為0。例如:

font &= ~bold & ~italic; //Turn bold and italic off

這個語句把font變量中的斜體和黑體位設置為0。注意這里不需要括號,因為~運算符的優先級高于&運算符。但是,如果不清楚運算符的優先級,就應加上括號,表示希望執行的操作。這肯定是無害的,在需要括號時還可以正常發揮作用。

3. 使用按位異或運算符

按位異或運算符的使用頻率遠遠低于&和 | 運算符,有關它的使用例子也比較少。但它的一個重要應用是圖形編程。在屏幕中創建動畫的一種方式是繪制一個對象,刪除它,再在一個新位置重新繪制。如果要 求動畫很平滑,這個過程就需要重復得很快,其中刪除是一個重要的部分。我們并不想刪除和重新繪制整個屏幕,因為這非常費時,屏幕也會出現閃爍。最理想的 是,只刪除屏幕上要移動的對象。使用所謂的異或模式就可以做到這一點,得到非常平滑的 動畫。

異或模式的理念是,在屏幕上用給定的顏色繪制對象,如果接著用背景色重新繪制它,它就會消失。如圖3-3所示。

圖3-3 用異或模式繪圖

以異或模式在屏幕上繪制對象時,每次繪制對象的顏色會自動在為對象所選的顏色和背景色之間來回變化。得到這一效果的關鍵是使用按位異或運算符快速而 自動地改變顏色。它使用異或運算符的一個特性,即如果對兩個值進行異或操作,再對所得的結果和一個原始值執行異或操作,就會得到另一個值。這聽起來很復 雜,下面就用一個例子來說明。

假定要在前景色(這里使用紅色)和背景色(白色)之間來回切換。顏色通常用3個8位值來表示,分別對應于紅、藍、綠的亮度,存儲在一個4字節的整數 中。通過改變顏色中的紅、藍和綠的比例,就可以獲得大約1600萬種不同的顏色,包括從白色到黑色之間的所有顏色。純紅色是0xFF0000,這時紅色成 分設置為其最大值,其他兩種顏色即藍色和綠色的成分設置為0。在相同顏色模式下,綠色就是0xFF00,藍色是0xFF。在白色中,紅、藍、綠的成分具有 相同的最大值,即0xFFFFFF。

可以用下面的語句定義表示紅色和白色的變量:

unsigned long red=0XFF0000UL; //Color red

unsigned long white=0XFFFFFFUL; //Color white-RGB all maximum

接著創建一個掩碼,用于在紅色和白色之間來回切換,并把包含繪圖顏色的變量初始化為紅色:

unsigned long mask=red ^ white; //Mask for switching colors

unsigned long draw_color=red; //Drawing color

變量mask初始化為要切換的兩種顏色的按位異或操作結果,因此:

red 1111 1111 0000 0000 0000 0000

white 1111 1111 1111 1111 1111 1111

mask(即red ^ white) 0000 0000 1111 1111 1111 1111

如果對mask和red執行異或操作,就會得到white,如果對mask和white執行異或操作,就會得到red。因此,使用draw_color中的顏色繪制對象,就可以通過下面的語句切換顏色:

draw_color ^= mask; //Switch the drawing color

當draw_color包含red時,其執行過程如下:

draw_color 1111 1111 0000 0000 0000 0000

mask 0000 0000 1111 1111 1111 1111

draw_color ^ mask 1111 1111 1111 1111 1111 1111

顯然,draw_color的值從紅色變為白色。再次執行這個語句,就會把顏色改回為紅色:

draw_color^=mask; //Switch the drawing color

其執行過程如下:

draw_color 1111 1111 1111 1111 1111 1111

mask 0000 0000 1111 1111 1111 1111

draw_color ^ mask 1111 1111 0000 0000 0000 0000

draw_color又變成了紅色。這個技術適用于任意兩種顏色,當然它實際上與特定顏色沒有一點關系,可以把它用于切換任意一對整型數值。

程序示例3.4—— 使用按位運算符

下面用一個例子來試驗按位運算符,看看它們如何一起工作。本例還演示了如何使用異或運算符在兩個值之間切換,以及如何使用掩碼來選擇和設置各個位。代碼如下:

//Program 3.4 Using the bitwise operators

#include <iostream>

#include <iomanip>

using std::cout;

using std::endl;

using std::setfill;

using std::setw;

 

int main() {

unsigned long red=0xFF0000UL; //Color red

unsigned long white=0xFFFFFFUL; //Color white - RGB all maximum

 

cout << std::hex; //Set hexadecimal output format

cout << setfill('0'); //Set fill character for output

 

cout << "\nTry out bitwise AND and OR operators.";

cout << "\nInitial value red = "<< setw(8) << red;

cout << "\nComplement ~red = "<< setw(8) <<~ red;

 

cout << "\nInitial value white = "<< setw(8) << white;

cout << "\nComplement ~ white = "<< setw(8) <<~ white;

 

cout << "\n Bitwise AND red & white = " << setw(8) << (red & white);

cout << "\n Bitwise OR red | white = " << setw(8) << (red | white);

 

cout << "\n\nNow we can try out successive exclusive OR operations.";

 

unsigned long mask=red ^ white;

 

cout << "\n mask= red ^ white = " << setw(8) << mask;

cout << "\n mask ^ red = " << setw(8) << (mask ^ red);

cout << "\n mask ^ white = " << setw(8) << (mask ^ white);

 

unsigned long flags=0xFF; //Flags variable

unsigned long bit1mask=0x1; //Selects bit 1

unsigned long bit6mask=0x20; //Selects bit 6

unsigned long bit20mask=0x80000; //Selects bit 20

 

cout << "\n\nNow use masks to select or set a particular flag bit.";

cout << "\nSelect bit 1 from flags : " << setw(8) << (flags & bit1mask);

cout << "\nSelect bit 6 from flags : " << setw(8) << (flags & bit6mask);

cout << "\nSwitch off bit 6 in flags : " << setw(8) << (flags &= ~bit6mask);

cout << "\nSwitch on bit 20 in flags : " << setw(8) << (flags |= bit20mask);

cout <<endl;

return 0;

}

該例子的輸出如下:

Try out bitwise AND and OR operators.

Initial value red = 00ff0000

Complement ~red = ff00ffff

Initial value white = 00ffffff

Complement ~ white = ff000000

Bitwise AND red & white = 00ff0000

Bitwise OR red | white = 00ffffff

 

Now we can try out successive exclusive OR operations.

mask= red ^ white =0000ffff

mask ^ red = 00ffffff

mask ^ white =00ff0000

 

Now use masks to select or set a particular flag bit.

Select bit 1 from flags : 00000001

Select bit 6 from flags : 00000020

Switch off bit 6 in flags : 000000df

Switch on bit 20 in flags : 000800df

例子的說明

本例中添加了對標準頭文件<iomanip>的#include指令,這個頭文件在第2章介紹過,因為代碼將使用操縱程序控制輸出的格式。首先,定義兩個整數變量,它們包含的值表示要用于后續按位運算的顏色:

unsigned long red=0xFF0000UL; //Color red

unsigned long white=0xFFFFFFUL; //Color white - RGB all maximum

為了把數據顯示為十六進制值,可用下面的語句指定:

cout << std::hex; //Set hexadecimal output format

其中hex是一個操縱程序,它把整數值的輸出表示為十六進制。注意,這是模式化的,該程序以后在標準輸出流中的所有整數輸出都采用十六進制格式。不需要把hex發送給輸出流cout。如果需要,可以用下面的語句把輸出格式改回為十進制:

cout << std::dec; //Set decimal output format

這個語句使用dec操縱程序,把整數輸出重新設置為默認的十進制表示。注意,把輸出格式設置為十六進制,僅影響整數值。浮點數值會繼續顯示為一般的十進制。

如果在輸出整數時加上前導0,就會使結果更清晰易懂。用下面的語句設置這種模式:

cout << setfill('0'); //Set fill character for output

其中setfill()是一個操縱程序,它把填充字符設置為括號中的字符。這也是模式化的,這樣,以后的所有整數輸出都會在需要時使用這個填充字符。它對十進制和十六進制輸出都起作用。如果要用星號代替該填充字符,則可以使用下面的語句:

cout << setfill('*'); //Set fill character for output

要把填充字符設置回原來的默認值,只需在括號中使用空格:

cout << setfill(' '); //Set fill character for output

下面的語句顯示red的值及其反碼:

cout << "\nInitial value red = "<< setw(8) << red;

cout << "\nComplement ~red = "<< setw(8) <<~ red;

這里使用第2章介紹的setw()操縱程序,把輸出字段寬度設置為8。如果所有的輸出值都采用相同的字段寬度,就很容易比較它們。設置寬度不是模式化的,它只應用于跟在字段寬度設置點后面的下一條語句的輸出。在red和white的輸出中,~運算符反轉了其操作數的位。

下面的語句使用按位與以及按位或運算符來合并red和white:

cout << "\n Bitwise AND red & white = " << setw(8) << (red & white);

cout << "\n Bitwise OR red | white = " << setw(8) << (red | white);

注意輸出中表達式的括號。它們是必需的,因為<<的優先級高于&和|。沒有括號,該語句就不會編譯。如果查看一下輸出,就會看 出它跟這里討論的相同。若對兩個值都為1的位執行按位與操作,就會得到1,否則結果就是0。在對兩個位執行按位或操作時,除非兩個位都是0,否則結果就是 1。

然后,創建一個掩碼,在通過按位異或運算符組合兩個值時,該掩碼用于反轉red和white的值。

unsigned long mask=red ^ white;

如果查看一下mask值的輸出,就會發現在兩個位的值不同時,對兩個位執行異或操作的結果是1,在兩個位的值相同時,該操作的結果是0。利用異或運算符把mask和兩個顏色值中的一個組合起來,就會得到另一個顏色值。這可以用下面的語句來說明:

cout << "\n mask ^ red = " << setw(8) << (mask ^ red);

cout << "\n mask ^ white = " << setw(8) << (mask ^ white);

最后一組語句演示了如何使用掩碼從一組標記位中選擇一個位。選擇某個位的掩碼必須使該位的值為1,其他位的值為0。因此,從一個32位long變量中選擇第1、6和20位的掩碼定義如下:

unsigned long bit1mask=0x1; //Selects bit 1

unsigned long bit6mask=0x20; //Selects bit 6

unsigned long bit20mask=0x80000; //Selects bit 20

要從flags中選擇一個位,只需對相應的掩碼和flages的值執行按位與操作。例如:

cout << "\nSelect bit 6 from flags : " << setw(8) << (flags & bit6mask);

從輸出中可以看到,表達式(flags & bit6mask)的結果是只設置了第6位的整數。當然,如果flages中的第6位為0,該表達式的結果就是0。

要關閉一個位,需要對flages變量和一個掩碼執行按位與操作。在該掩碼中,要關閉的那個位是0,其他位是1。對掩碼和對應的位執行按位求反操作,也可以關閉該位。bit6mask就是這樣的一個掩碼。下面的語句把flags中的第6位關閉,并顯示結果:

cout << "\nSwitch off bit 6 in flags : " << setw(8) << (flags &= ~bit6mask);

當然,如果第6位已經是0,該位就保持不變。要打開一個位,只需對flages和一個掩碼執行按位或操作,在該掩碼中,要打開的那個位是1:

cout << "\nSwitch on bit 20 in flags : " << setw(8) << (flags |= bit20mask);

這個語句把flags中的第20位設置為1,并顯示結果。如果這個位已經是1,該位將保持不變。

4. 輸出操縱程序

把第2章介紹的也算在內,到目前為止我們已介紹了5個模式化輸出操縱程序,它們都是在<iostream>頭文件中定義 的:scientific、fixed、dec、hex和oct。表3-2列出所有的其他相似的操縱程序。目前不介紹后兩項中的bool值,它將在第4章 討論。

表3-2 輸出操縱程序

操 縱 程 序

執行的動作

dec

把整數值格式化為十進制。這是默認的表示法

hex

把整數值格式化為十六進制

oct

把整數值格式化為八進制

left

使輸出字段中的值左對齊,其右端用填充字符填充。默認的填充字符是空格

right

使輸出字段中的值右對齊,其左端用填充字符填充。這是默認的對齊方式

fixed

以固定點表示法輸出浮點數值,即不帶指數

scientific

以科學表示法輸出浮點數值,即尾數加指數的方式。默認的模式根據要顯示的數值,選擇fixed或scientific表示法

showpoint

給浮點數值顯示小數點和尾部的0

noshowpoint

與上一個操縱程序相反。這是默認的

showbase

在八進制的輸出前面加上前導0,在十六進制的輸出前面加上前導0x或0X

noshowbase

八進制和十六進制的輸出中不顯示前綴。這是默認的

showpos

正數前面加上+號

noshowpos

正數前面不顯示+號,這是默認的

uppercase

在以十六進制格式輸出整數時,給十六進制數字顯示大寫字母A到F。如果設置了showbase,還要顯示0X。在以科學計數法輸出數值時,給指數顯示E,而不是使用小寫字母e

nouppercase

對上述項使用小寫字母,這是默認的

boolalpha

把bool值顯示為true和false

noboolalpha

把bool值顯示為1和0

可以一次設置多種模式,方法是在流中插入多個操縱程序。例如,如果要把整型數據輸出為十六進制值,且在輸出字段中左對齊,就可以使用下面的語句:

std::cout << std::hex << std::left << value;

這個語句會把value(以及程序中后續的所有整數,除非改變了設置)輸出為左對齊的十六進制數值。

表3-3列出了需要提供參數值的輸出操縱程序。

表3-3 需要參數的輸出操縱程序

操 縱 程 序

執行的動作

setfill()

把填充字符設置為參數指定的字符。默認的填充字符是空格

setw()

把字段寬度設置為參數指定的值

setprecision()

把浮點值的精度設置為參數指定的值。精度是輸出中十進制數字的個數

posts - 94, comments - 138, trackbacks - 0, articles - 94

Copyright © RichardHe

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美美女| 欧美福利视频一区| 国产欧美日韩精品一区| 欧美日韩一区二区三区免费看| 久久精品五月婷婷| 欧美一级在线播放| 欧美一区二区精品久久911| 午夜精品亚洲一区二区三区嫩草| 午夜精品理论片| 欧美一区二区三区免费观看| 亚洲永久免费精品| 久久久亚洲高清| 欧美成人网在线| 国产精品美女久久久| 国产免费观看久久黄| 国产日本欧美一区二区三区在线| 国产偷自视频区视频一区二区| 国产午夜久久| 亚洲国内自拍| 国产区欧美区日韩区| 欧美精品一区在线播放| 欧美成人久久| 欧美日韩国产在线看| 欧美午夜电影在线观看| 狠狠久久亚洲欧美| 亚洲最新在线视频| 久久国产免费| 欧美黄色一区| 宅男噜噜噜66一区二区66| 欧美一区激情| 欧美国产日本| 国产日产亚洲精品系列| 亚洲国产老妈| 亚洲午夜精品久久久久久app| 久久精品国产久精国产思思| 免费日韩成人| 香蕉久久精品日日躁夜夜躁| 久久综合网hezyo| 欧美私人网站| 亚洲人成亚洲人成在线观看 | 国产精品久久久久99| 亚洲国产99| 久久精品视频免费观看| 一片黄亚洲嫩模| 欧美激情亚洲自拍| 136国产福利精品导航网址应用| 99re6这里只有精品| 美女诱惑黄网站一区| 亚洲一区激情| 欧美亚洲不卡| 一区二区三区|亚洲午夜| 欧美大色视频| 久久综合色影院| 在线欧美亚洲| 欧美大片在线观看| 麻豆精品国产91久久久久久| 激情成人综合| 麻豆精品91| 夜夜嗨av色综合久久久综合网| 欧美精品一区二区三区视频| 亚洲品质自拍| 亚洲国产精品专区久久 | 欧美午夜激情小视频| 亚洲精品美女| 亚洲黄色成人网| 欧美日韩在线播放三区| 日韩视频一区二区| 欧美大片免费观看| 欧美电影资源| 一区二区日韩精品| 一本久久a久久精品亚洲| 欧美视频在线免费看| 欧美一级日韩一级| 久久精品免费看| 国内精品视频一区| 欧美国产国产综合| 欧美一区二区三区免费视| 亚洲精品久久久久久久久久久久| 欧美激情综合色| 欧美激情一区二区三区在线视频| 亚洲精品一区中文| aa日韩免费精品视频一| 国产精品麻豆欧美日韩ww| 久久久91精品国产| 久久性色av| 99精品视频免费观看视频| av成人老司机| 国外视频精品毛片| 欧美顶级艳妇交换群宴| 欧美成人一区二区| 午夜精品理论片| 久久综合99re88久久爱| 这里只有精品在线播放| 亚洲欧美www| 一区在线视频观看| 亚洲国产影院| 欧美日韩日本网| 亚洲欧美日本日韩| 美脚丝袜一区二区三区在线观看 | 亚洲免费中文字幕| 亚洲精品一二三| 国产女精品视频网站免费| 免费欧美电影| 国产精品v欧美精品v日韩| 久久久国产视频91| 欧美视频日韩视频在线观看| 免费在线观看日韩欧美| 国产精品激情| 亚洲日本成人女熟在线观看| 国产日韩在线一区| 亚洲精品欧美日韩| 亚洲成色777777女色窝| 亚洲少妇诱惑| aaa亚洲精品一二三区| 久久久久9999亚洲精品| 性8sex亚洲区入口| 欧美日韩在线视频一区二区| 欧美电影在线观看| 伊大人香蕉综合8在线视| 午夜精品在线看| 午夜免费久久久久| 欧美香蕉视频| 亚洲毛片在线| 日韩视频中文字幕| 麻豆精品视频| 嫩模写真一区二区三区三州| 国产日韩欧美视频| 亚洲一区bb| 亚洲永久免费精品| 欧美日韩在线精品一区二区三区| 欧美韩日一区二区| 亚洲黄色三级| 欧美freesex8一10精品| 欧美成人免费网站| 在线日韩欧美| 久久综合电影一区| 欧美激情a∨在线视频播放| 韩国成人理伦片免费播放| 欧美一区影院| 久久久久久自在自线| 欧美一级欧美一级在线播放| 欧美视频在线观看一区| 亚洲电影观看| 国产伦精品一区二区三区四区免费| 亚洲欧美精品中文字幕在线| 欧美日韩18| 亚洲免费高清| 亚洲一区二区视频在线| 欧美日韩精品免费看| 99精品国产高清一区二区| 亚洲伦理在线免费看| 欧美激情 亚洲a∨综合| 亚洲美女精品成人在线视频| 一本色道久久88精品综合| 欧美日韩亚洲一区二区三区在线 | 欧美国产91| 亚洲精品国产品国语在线app| 一区二区日本视频| 国产精品入口麻豆原神| 久久av红桃一区二区小说| 欧美91精品| 夜夜嗨av一区二区三区四区| 国产精品成人免费| 欧美一区视频在线| 欧美激情欧美狂野欧美精品| 亚洲性色视频| 国内精品视频在线观看| 免费看亚洲片| 日韩亚洲在线| 老妇喷水一区二区三区| 日韩午夜三级在线| 国产日韩精品视频一区二区三区| 久久蜜桃精品| 一区二区高清视频在线观看| 久久成人人人人精品欧| 亚洲精品一区二区三区在线观看| 国产精品高清在线观看| 久久精品在线观看| 亚洲手机在线| 亚洲国产精品va在线看黑人动漫| 亚洲一区二区三区高清| 亚洲成色777777女色窝| 国产精品私拍pans大尺度在线| 另类欧美日韩国产在线| 夜夜嗨av一区二区三区四季av| 免费91麻豆精品国产自产在线观看| 91久久在线| 黄色影院成人| 国产精品二区三区四区| 免费看成人av| 久久久久久国产精品mv| 亚洲午夜日本在线观看| 亚洲电影毛片| 免费av成人在线| 久久精品九九| 一区二区av在线| 激情综合网激情| 国产一区二区三区免费不卡 | 欧美日韩一区二区精品| 久久亚洲私人国产精品va|