P1201高低位交換解題報告

2021-04-23 07:48:33 字數 3376 閱讀 5751

name: p1201高低位交換 

author: goal00001111

date: 17-12-08 09:24

description:

描述 description    

給出乙個小於2^32的正整數。這個數可以用乙個32位的二進位制數表示(不足32位用0補足)。

我們稱這個二進位制數的前16位為「高位」,後16位為「低位」。將它的高低位交換,我們可以得到乙個新的數。

試問這個新的數是多少(用十進位制表示)。

例如,數1314520用二進位制表示為0000 0000 0001 0100 0000 1110 1101 1000(新增了11個前導0補足為32位),

其中前16位為高位,即0000 0000 0001 0100;後16位為低位,即0000 1110 1101 1000。將它的高低位進行交換,

我們得到了乙個新的二進位制數0000 1110 1101 1000 0000 0000 0001 0100。它即是十進位制的249036820。

輸入格式 input format    

乙個小於2^32的正整數

輸出格式 output format    

將新的數輸出

樣例輸入 sample input    

1314520

樣例輸出 sample output    

249036820

題目分析:

這是一道考查位運算的題目,如果我們對位運算足夠熟悉的話,主要**可以簡單到只有一行。

我將依次分析常規方法和巧妙利用位運算的方法。

方法一:常規方法是直接根據題意,模擬十進位制和二進位制的轉換過程。方法雖然繁瑣,

但是卻能夠幫助我們加深對進製轉換的理解,特別是十進位制轉換為二進位制,利用了位運算中的與運算,得到各位的值,很巧妙。

方法二:使用了一定的數學分析,注意到n的低16位數low = n % (2^16); 高16位數high = n - low;

然後將low*(2^16)就變成高16位,而high / (2^16)就變成了低16位,從而完成轉換。

方法三:位運算的巧妙應用,分別將n左右移位16位,然後相加就行了,則執行(n << 16) | (n >> 16)即可。

說明:

演算法思想:直接模擬或數學分析。

資料結構:陣列。

時間複雜度:o(1);;

空間複雜度:方法一為o(32),方法二,三不需要輔助空間;

程式語言:分別用c++和pascal實現。

附註:分別提供了直接模擬和數學分析等三者實現方法。

有關位運算的詳細知識請參考:matrix67的部落格http://www.matrix67.com/blog/archives/263

c++**:

#include

using namespace std;

unsigned long long simulate(unsigned long long n);//直接模擬方法

unsigned long long analyse(unsigned long long n); //數學分析方法1:間接移位

unsigned long long shift(unsigned long long n); //數學分析方法2:直接移位

int main()

//直接模擬方法:先將十進位制數轉換成二進位制,高低換位後再換回來  

unsigned long long simulate(unsigned long long n)

;//儲存2^n(n=0,1,2,...,31)

int b[32] = ; //用來儲存二進位制數

for (int i=1; i<32; i++)//計算並儲存2^n(n=0,1,2,...,31) 

for (int i=0; i<32; i++) //轉化成二進位制數

for (int i=0; i<16; i++)   //高低換位

n = 0;

for (int i=0; i<32; i++)//轉化成十進位制數

return n;

} //數學分析方法:分別取高低16位後,進行移位運算換位

unsigned long long analyse(unsigned long long n)

//數學分析方法:直接進行移位運算換位

unsigned long long shift(unsigned long long n)

pascal**:

program p1201 (input, output);

varn : longword;

function analyse(n : longword):longword;

const

max = 65536;

vardest, high, low : longword;

begin

low  := n mod max;    

high := n - low;      

dest := low * max;    

dest := dest + high div max; 

analyse := dest;

end;

function shift(n : longword):longword;

begin

shift := (n shr 16) or (n  shl 16);

end;

function simulate(n : longword):longword;

vara : array [1..32] of longword; 

b : array [1..32] of integer;  

i, temp : integer;

begin

a[1] := 1;

for i:=2 to 32 do    

a[i] := a[i-1] * 2;

for i:=1 to 32 do   

b[33-i] := ord((a[i] and n) <> 0);

for i:=1 to 16 do     

begin

temp := b[i];

b[i] := b[i+16];

b[i+16] := temp;

end;

n := 0;

for i:=1 to 32 do   

n := n + a[i] * b[33-i];

simulate := n;

end;

begin

read(n);

writeln(analyse(n));

writeln(simulate(n));

writeln(shift(n));

readln;

end.

Vijos P1201 高低位交換

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

P1100 高低位交換

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

P1100 高低位交換(位運算)

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