洛谷P1100 位運算 進製轉換解釋

2021-10-10 07:42:17 字數 2175 閱讀 4057

ac**如下:

#include

#include

using namespace std;

intmain()

你沒有看錯,就是這麼簡單,就是這麼酸爽,上個月寫的70行**記憶猶新…

先聊聊二進位制吧

總所周知,計算機的記錄方式是二進位制記錄,即計算機的世界是0和1的世界。但我們現實生活卻屬於十進位制的世界,那麼如何將十進位制轉化為二進位制呢?

實現**如下:

#include

#include

#include

using namespace std;

int s[

100]

;int

main()

for(

int j=i;j>=

0;j--

) cout<<<

' ';

cout

}

如果單看這段**實際上是比較抽象的,但當你了解如何將二進位制轉化為十進位制就懂了!

比如說:

5=101=((1*2)+0)*2+1

那麼在十進位制轉二進位制中:

過程一:

5%2=1 這個1 就相當於上面式子的最後乙個1。

5-1=4

4/2=2

過程二:

2%2=0 這個0就相當於括號內的那個0。

2-0=2

2/2=1

過程三:

1%2=1 這個1相當於開始的那個1。

1/2=0 結束迴圈。

所以5的二進位制是101

二進值轉十進值**如下:

#include

#include

#include

#include

using namespace std;

intmain()

cout

}

在聊完二進位制後再聊聊 unsigned

以前總是可以看到一些大佬的**裡有 unsigned int ans 這個定義,一開始我還是不太了解為什麼要定義乙個unsigned,直接int不好嗎,但學了位運算後明白的徹底。

首先必須知道 int的有效位數是32位,long long的位數是64位。

32位的意義是用二進位制儲存可以用32個1,即 1111…111 但是int定義的最大位應該是31位,因為最前面的那一位是符號判斷位,如果是0,就是正數,如果是1則表示負數。

而如果用unsigned int 則最大位可以達到32位,因為最前面的那一位不用用來當成符號判斷位了。

知道了這些後,就應該要學會位運算了

位運算的功能強大到可怕,我也是一知半解,但我發現一篇很好的文章,就直接引用了:

最後再聊回題目本身

給出乙個小於32位的正整數。這個數可以用乙個3232位的二進位制數表示(不足3232位用00補足)。我們稱這個二進位制數的前1616位為「高位」,後1616位為「低位」。將它的高低位交換,我們可以得到乙個新的數。試問這個新的數是多少(用十進位制表示)。

例如,數13145201314520用二進位制表示為0000 0000 0001 0100 0000 1110 1101

100000000000000101000000111011011000(新增了1111個前導00補足為3232位),其中前1616位為高位,即0000

0000 0001 01000000000000010100;後1616位為低位,即0000 1110 1101

10000000111011011000。將它的高低位進行交換,我們得到了乙個新的二進位制數0000 1110 1101 1000 0000

0000 0001

010000001110110110000000000000010100。它即是十進位制的249036820249036820。

這題有坑,如果你是先把十進位制轉化為二進位制,再調換位置,再將二進位制轉化為十進位制的,那麼你已經輸了一半了。

我再次強調,在計算機裡,儲存是二進位制儲存,那麼即使你輸入的是乙個十進值的數,它在計算機裡表達的還是二進位制,所以你只需要通過位運算模擬題目就行。所以本題ac**簡短到令人害怕。

洛谷 P1100 高低位交換

p1100 高低位交換 include include define ll long long 定價代換ll 代替long long void sw int a,int b 自定義數值交換函式 void fun ll n ll sum 0 int x 32 int k 0 while n n一直對2...

洛谷 P1100 高低位交換

給出乙個小於 2 的正整數。這個數可以用乙個 32 位的二進位制數表示 不足 32 位用 0 補足 我們稱這個二進位制數的前 16 位為 高位 後 16 位為 低位 將它的高低位交換,我們可以得到乙個新的數。試問這個新的數是多少 用十進位制表示 例如,數 1314520 用二進位制表示為 0000 ...

洛谷 高低位交換(P1100,二進位制)

給出乙個小於2 32的正整數。這個數可以用乙個32位的二進位制數表示 不足32位用0補足 我們稱這個二進位制數的前16位為 高位 後16位為 低位 將它的高低位交換,我們可以得到乙個新的數。試問這個新的數是多少 用十進位制表示 例如,數1314520用二進位制表示為00000000000101000...