题目来源:

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次方的计算_操作符_02

但是题目还有一个要求说:使用移位运算

那么显然常规算法是不可以在这里使用的

我们首先来思考移位操作符是怎么操作一个数字的。

在之前操作符知道:


移位操作符: >>     <<

移位操作符:其实是作用于一个数的二进制数


 举例我们可得知:

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次方的计算_位运算_03

[C语言练习题 ] 通过移位运算(<<)实现2的n次方的计算_位运算_04[C语言练习题 ] 通过移位运算(<<)实现2的n次方的计算_移位运算_05

 转换成十进制,我们发现给一个数字左移一位就像给这个数字乘上了2

那么我们显然可以得知,要计算2的n次方,我们可以给数字1的二级制数左移n位就得到了2的n次方

[C语言练习题 ] 通过移位运算(<<)实现2的n次方的计算_位运算_06[C语言练习题 ] 通过移位运算(<<)实现2的n次方的计算_位运算_07

 因此我们用代码实现:

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

return 0;
}

[C语言练习题 ] 通过移位运算(<<)实现2的n次方的计算_位运算_08

 或者我们用数字2开始左移(n-1)位也是可以的

[C语言练习题 ] 通过移位运算(<<)实现2的n次方的计算_移位运算_09[C语言练习题 ] 通过移位运算(<<)实现2的n次方的计算_移位运算_10​编辑

 到底和上面一样

[C语言练习题 ] 通过移位运算(<<)实现2的n次方的计算_移位运算_11[C语言练习题 ] 通过移位运算(<<)实现2的n次方的计算_移位运算_12

 测试:


示例1

输入:

2

输出:

4

[C语言练习题 ] 通过移位运算(<<)实现2的n次方的计算_位运算_13[C语言练习题 ] 通过移位运算(<<)实现2的n次方的计算_位运算_14


示例2

输入:

10

输出:

1024



 [C语言练习题 ] 通过移位运算(<<)实现2的n次方的计算_操作符_15[C语言练习题 ] 通过移位运算(<<)实现2的n次方的计算_操作符_16

 最后我们将代码放在牛客网中发现也是没问题的

[C语言练习题 ] 通过移位运算(<<)实现2的n次方的计算_移位运算_17[C语言练习题 ] 通过移位运算(<<)实现2的n次方的计算_操作符_18

结论:

本题的练习让我们对左移操作符进行了复习,也让我们掌握了一种非常规算法的2的n次方的求解方法,感兴趣的小伙伴可以自己尝试尝试哦~

(本题完)