移位運算子

2021-08-28 02:59:17 字數 1273 閱讀 9539

位運算子的執行速度要快於算術運算子,用位運算子代替算數符會加快程式執行速度。移位運算子包括<<(左移)和》(右移)。左移運算子的作用是將乙個二進位制位的運算元按指定的移動位數向左移動,移出位被丟棄,右邊的空位一律補0;右移運算子的作用是將乙個二進位制位的運算元按指定的移動位數向右移動,移出位被丟棄,左邊的空位一律補0;

例如:1<<1:1的二進位制是0001,進行一次《運算後,變成了0010,則1<<1的值是2。

1<<4:值為16,相當於1*2^4。

16>>3:值為2,相當於16/(2^3)。

給出兩個不大於65535的非負整數,判斷其中乙個的16位二進位制表示形式,是否能由另乙個的16位二進位制表示形式經過迴圈左移若干位而得到。 

迴圈左移和普通左移的區別在於:最左邊的那一位經過迴圈左移一位後就會被移到最右邊去。比如: 

1011 0000 0000 0001 經過迴圈左移一位後,變成 0110 0000 0000 0011, 若是迴圈左移2位,則變成 1100 0000 0000 0110 

input

第一行是個整數n, 0 < n < 300000,表示後面還有n行資料 

後面是n行,每行有兩個不大於65535的非負整數

output

對於每一行的兩個整數,輸出一行,內容為yes或no

sample input

4

2 49 18

45057 49158

7 12

sample output

yes

yesyes

no

本題中如何實現迴圈左移是關鍵,迴圈左移k位實際上就是將16位二進位制的前k位挪到後(16-k)位的後面。則可以先將該數左移k為,再右移(16-k)位,再將得到的兩個數進行或運算:

例如45057二進位制為: 1011 0000 0000 0001。

迴圈左移3位結果是 : 1000 0000 0000 1101。

先將它左移3位得到 : 1000 0000 0000 1000,

再原數右移13位得到:0000 0000 0000 0101,

兩個數再進行或運算:1000000000001101,與迴圈左移得到的結果是一樣的。

則本題的思路是進行16次這樣的位運算,如果在過程中與另乙個數相等了,則輸出yes,若16次後還沒有得到過與另乙個數相等的值,則輸入no。**如下:

#include #includeint main()

} if (!flag)

printf("no\n");

}}

移位運算子

移位運算子不外乎就這三種 左移 帶符號右移 和 無符號右移 1 左移運算子 左移運算子 使指定值的所有位都左移規定的次數。1 它的通用格式如下所示 value num num 指定要移位值value 移動的位數。左移的規則只記住一點 丟棄最高位,0補最低位 如果移動的位數超過了該型別的最大位數,那麼...

移位運算子

二進位制運算子,包括位運算子和移位運算子,使程式設計師可以在二進位制基礎上運算元字,可以更有效的進行運算,並且可以以二進位制的形式儲存和轉換資料,是實現網路協議解析以及加密等演算法的基礎。左移 帶符號右移 和 無符號右移 左移 在數字沒有溢位的前提下,對於正數和負數,左移一位都相當於乘以2的1次方,...

移位運算子

按二進位制形式把所有的數字向左移動對應的位數,高位移出 捨棄 低位的空位補零。語法格式 需要移位的數字 移位的次數 例如 3 2,則是將數字3左移2位 計算過程 3 2 首先把3轉換為二進位制數字0000 0000 0000 0000 0000 0000 0000 0011,然後把該數字高位 左側 ...