WIN Linux Web三個平台下的滿位移操作

2021-10-13 22:24:36 字數 1903 閱讀 5050

滿位移操作:是指對變數進行左移或右移的位數大於等於其所定義型別的位數。

例如,在32位編譯器下,unsigned int 為32位,對unsigned int 定義的變數左移或右移》=32位。

為了具有對比性,win/linux/web均採用32位編譯器。

1.2.1 win32平台編譯器

案例一:定義unsigned int 型別變數,並左移32位。

執行結果:①編譯時沒有警告;②執行結果為1

案例二:定義unsigned int 型別變數,並左移33位

執行結果:①編譯時沒有警告;②執行結果為2

win32平台執行結果總結:移動位數為設定的移動位數除以32的餘數

1.2.2 linux平台編譯器

案例一:定義unsigned int 型別變數,並左移32位。

執行結果:①編譯時有警告:left shift cout >=width;②執行結果為1

案例二:定義unsigned int 型別變數,並左移33位。

執行結果:①編譯時有警告;②執行結果為2

linux平台執行結果總結:和win32保持一致。移動位數為設定的移動位數除以32的餘數

1.2.3 web平台的emscripten編譯器

案例一:定義unsigned int 型別變數,並左移32位。

執行結果:①編譯時有警告;②執行結果為0

案例二:定義unsigned int 型別變數,並左移33位。

執行結果:①編譯時有警告;②執行結果為0

web平台執行結果總結:和win32/linux不一致。移動位數》=32位,結果為0(沒有對32位取餘)。

在開發web平台智慧型資訊過程中,發現應該顯示的規則框不顯示。

該段**在對rack進行左移n位後(l240),又進行了位或運算(l257),導致其在web平台執行時,結果出現異常。

存在問題:左移n=32位時,①rack列印出來是0,但邏輯判斷rack==0返回0即rack!=0;②rack=0x00000000,temp1=0x00000000,位或:rack|temp1=0xffffffff(某些應用場景是必現,但不是所有場景必現)。

2.2.2 解決方案:rack<<(n%32)

為了實現三個平台統一,左移位數使用(n%32)。

1. win32/linux平台位移位數(n%32),而web平台是高/低位補0;

2. web平台某些場景下,滿位移後,列印結果為0,但邏輯判斷不為0。

3.建議方案:在進行位移時,使用

rack<<=(n%(sizeof(n)*8))」代替「

rack<<=n」,使得位移操作在各個平台均可用(尤其在編譯器不是很成熟或穩定的場景)。

4. *注意*:若使用場景中,左移32位目的是讓其為0,後面可加上相等判斷。

漢語中「三個三個的,你認識多少?」

三個金念鑫 x n 三個水念淼 mi o 三個火念焱 y n 三個土念垚 y o 三個牛念犇 b n 三個手念掱 p 三個目念瞐 m 三個田念畾 l i 三個馬念驫 bi o 三個羊念羴 sh n 三個犬念猋 bi o 三個鹿念麤 c 三個魚念鱻 xi n 三個貝念贔 b 三個力念劦 lie 三個毛...

mysql 三個正規化

原子性。表的元組不可再拆分成更小的元組。非主鍵必須完全依賴主鍵,而不是僅僅依賴主鍵的一部分。舉個例子,美國銷售軍火的時候,對每一樣 根據國家或地區的不同而給出不同的 建個表看看 create table weapon price wp id unsigned int not null auto in...

NYOJ 三個水杯

時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述給出三個水杯,大小不一,並且只有最大的水杯的水是裝滿的,其餘兩個為空杯子。三個水杯之間相互倒水,並且水杯沒有標識,只能根據給出的水杯體積來計算。現在要求你寫出乙個程式,使其輸出使初始狀態到達目標狀態的最少次數。輸入第一行乙個整數n...