程式設計點滴之2的n次方

2021-05-22 01:39:03 字數 2438 閱讀 5249

對於程式設計人員來說,和2的n次方打交道那是經常的事了。

在這裡,我想先說一下2的n次方的一些特點,2的n次方是什麼樣的數呢,像1,2,4,8,16,32 ...... 512,1024 ......等等之類的數就是

2的n次方的數。

2的n次方的值從另一方面來說也就是1向左移動一些位數的值,如:1是2^0  == 1<<0,2是2^1 == 1<<1, 8是2^3 == 1<<3等等。

在這裡,我想說兩個關於2的n次方的兩個點,這也是在看linux**時經常出現的。

第乙個:

在這裡我先問一下:假設給出乙個變數val,如何判斷這個變數的值是2的n次方呢!--------先想一想。

答案是:

這裡利用了2的n次方的另乙個特點,我上面說道,2的n次方是1《下面看下:

1,2,4,8,16 ......

的二進位制數為:

1, 10, 100, 1000, 10000 ......

所以val是2^n的數的話,那麼val-1的值就是對val取反了,即是高位為0,其餘地位都為1,所以如果val為2^n,那麼val & (val-1)的值就一定為0。

這個判斷表示式在判斷一些變數值的合法性是經常使用的,比如,判斷磁碟扇區的大小和分割槽簇的大小的合法性時就會經常用到,因此扇區的大小和簇的大小一定是要2^n的值。

第二個問題是相除:

我們都知道,計算機對數值的計算最擅長的就是移位。

如果我們要做的操作是乘於乙個數,或除於乙個數,並且這個被乘數或被除數是2^n方的話,那麼我們最好的操作就是移位,因為直接乘於乙個數或除於乙個數還不如移位的計算速度來得快。下面舉一些例子來說明。

假如下面有幾個變數:

unsigned long long number_of_sector; // 表示這個分割槽的扇區總數,即是這個分割槽的大小

unsigned long long nr_cluster; // 表示這個分割槽的簇總數,也是這個分割槽的大小

int  sector_per_cluster; // 表示每簇有多少個扇區,即是簇的大小

int  sector_size; // 扇區大小

如果我們知道number_of_sector 和 sector_per_cluster的大小,那麼我們就可以計算到nr_cluster的值。

nr_cluster = number_of_sector / sector_per_cluster;

我們這樣計算是沒有什麼問題的,但是如果我們想要優化一下,我們就得看下下一種表示了。

首先,sector_per_cluster是乙個2^n的數,那麼除於這個數就可以表示成向右移動一定的位數,即

nr_cluster = number_of_sector / sector_per_cluster

== nr_cluster = number_of_sector * (1>> n)

== nr_cluster = number_of_sector >> n

那麼這個n是多少呢,例如如果sector_per_cluster是2的話,那麼這個n就是1,如果sector_per_cluster是4的話,那麼這個n就是2,如果sector_per_cluster是8的話,那麼這個n就是3 。。。。。。

看出規律了沒有,就是sector_per_cluster這個2^n的n的值,其實也是1>(w-1);

最後的問題就剩下了這個w怎麼計算了,別怕,看下linux的下的**,我把它拿出來給你看:

這個int ffs(int x)的函式就是計算x的最高位1的位置值的,慢慢體會吧 : )

那麼我們前面的表示式就可以寫成這樣了:

nr_cluster = number_of_sector / sector_per_cluster;

==nr_cluster = number_of_sector >>(ffs(sector_per_cluster) - 1);

如果我們有看一些源**的話,我們也會發現,有很多的變數會有相應的表示其需要移位的位數的乙個變數。例如:

sector_per_cluster就會有sector_per_cluster_bits

sector_size就會有sector_size_bits

sector_per_cluster_bits = ffs(sector_per_cluster) -1;

sector_size = ffs(sector_size) -1;

為什麼需要這樣的變數呢,其實也是為了優化和方便。例如有個變數 cluster_size表示簇的大小,那麼它的值就可以這樣計算:

cluster_size = sector_size * sector_per_cluster;

但是如果我們有sector_per_cluster_bits這樣的變數,上面的表示式就可以這樣計算了:

cluster_size = sector_size 《所以說,如果我們做乙個乘於或除於乙個數時,如果這個數是2^n的話,那麼我們就應該考慮向左或向右移動一定的位數來代替乘於或除於的計算了。

計算2的n次方

任意給定乙個正整數n n 100 計算2的n次方的值。輸入乙個正整數n。輸出2的n次方的值。計算2的n次方也是依次相乘2,大於個位則進製,從後向前儲存元素,所以要令初始值為1.includeint main 建立儲存資料的陣列 a 49 1 用陣列儲存 int n int i int x 0 x代表...

計算2的N次方

總時間限制 1000ms 記憶體限制 65536kb 描述任意給定乙個正整數n n 100 計算2的n次方的值。輸入輸入乙個正整數n。輸出輸出2的n次方的值。樣例輸入 5樣例輸出 32提示高精度計算 1 include 2 int main int argc,char ar 3 表示大整數,低位在前...

計算2的N次方 C語言

總時間限制 1000ms 記憶體限制 65536kb 描述 任意給定乙個正整數n n 100 計算2的n次方的值。輸入輸入乙個正整數n。輸出輸出2的n次方的值。思考 當n值小時可用函式pow 2,n 當2 n值大於int型的範圍時?樣例輸入 5樣例輸出 32核心思考 運用一維陣列如何在值大於等於10...