天天看點

[C語言練習題 ] 通過移位運算(<<)實作2的n次方的計算

題目來源:

https://www.nowcoder.com/practice/35a1e8b18658411388bc1672439de1d9?tpId=107&&tqId=33310&rp=1&ru=/ta/beginner-programmers&qru=/ta/beginner-programmers/question-ranking​

描述

不使用累計乘法的基礎上,通過移位運算(<<)實作2的n次方的計算。

資料範圍:0<=n<31

輸入描述:

一行輸入整數n(0 <= n < 31)。

輸出描述:

輸出對應的2的n次方的結果。

示例1

輸入:

2

輸出:

4      

示例2

輸入:
10      
輸出:
1024      

代碼實作:

//位運算
int main()
{
  int n = 0;
  scanf("%d", &n);
  //移位
  int sum = 1 << n;
  //或者
  int sum2 = 2 << (n - 1);
  printf("%d", sum);

  return 0;
}      
[C語言練習題 ] 通過移位運算(<<)實作2的n次方的計算

代碼分析:

題目要求計算2的n次方的結果,我們當然首先會想到使用math函數中的pow函數,直接pow(2,n)就可以解決問題,代碼如下:

正常算法
int main()
{
  int n = 0;
  scanf("%d", &n);
  int sum = pow(2, n);
  printf("%d", sum);
  return 0;
}      
[C語言練習題 ] 通過移位運算(<<)實作2的n次方的計算

但是題目還有一個要求說:使用移位運算

那麼顯然正常算法是不可以在這裡使用的

我們首先來思考移位操作符是怎麼操作一個數字的。

在之前操作符知道:

移位操作符: >>     <<

移位操作符:其實是作用于一個數的二進制數

 舉例我們可得知:

int main() {
  int a = 3;
  int b = a << 1;
  printf("%d\n", b);
  //  00000000 00000000 00000000 00000011       --3
                     //a<<1
  //  00000000 00000000 00000000 00000110       --6
  return 0;
}      
[C語言練習題 ] 通過移位運算(<<)實作2的n次方的計算
[C語言練習題 ] 通過移位運算(<<)實作2的n次方的計算
[C語言練習題 ] 通過移位運算(<<)實作2的n次方的計算

 轉換成十進制,我們發現給一個數字左移一位就像給這個數字乘上了2

那麼我們顯然可以得知,要計算2的n次方,我們可以給數字1的二級制數左移n位就得到了2的n次方

[C語言練習題 ] 通過移位運算(<<)實作2的n次方的計算
[C語言練習題 ] 通過移位運算(<<)實作2的n次方的計算

 是以我們用代碼實作:

//位運算
int main()
{
  int n = 0;
  scanf("%d", &n);
  //移位
  int sum = 1 << n;
  printf("%d", sum);

  return 0;
}
      
[C語言練習題 ] 通過移位運算(<<)實作2的n次方的計算

 或者我們用數字2開始左移(n-1)位也是可以的

[C語言練習題 ] 通過移位運算(<<)實作2的n次方的計算
[C語言練習題 ] 通過移位運算(<<)實作2的n次方的計算

​編輯

 到底和上面一樣

[C語言練習題 ] 通過移位運算(<<)實作2的n次方的計算
[C語言練習題 ] 通過移位運算(<<)實作2的n次方的計算

 測試:

示例1

輸入:

2

輸出:

4      
[C語言練習題 ] 通過移位運算(<<)實作2的n次方的計算
[C語言練習題 ] 通過移位運算(<<)實作2的n次方的計算

示例2

輸入:
10      
輸出:
1024      
[C語言練習題 ] 通過移位運算(<<)實作2的n次方的計算
[C語言練習題 ] 通過移位運算(<<)實作2的n次方的計算

 最後我們将代碼放在牛客網中發現也是沒問題的

[C語言練習題 ] 通過移位運算(<<)實作2的n次方的計算
[C語言練習題 ] 通過移位運算(<<)實作2的n次方的計算

繼續閱讀