求移位运算“<<”算式
int a;
int input;//这个数的值由用户输入
如果输入8,a * input 的结果相当于 a<<3;
如果输入16,a * input 的结果相当于 a<<4;
如果输入32,a * input 的结果相当于 a<<5;
如果输入64,a * input 的结果相当于 a<<6;
如果输入128,a * input 的结果相当于 a<<7;
......
现在要把乘法运算转换为更快的移位运算,那么如何求出输入值和移位运算值的对应关系?
输入8求出3
输入16求出4
输入32求出5
输入64求出6
输入128求出7
输入256求出8
等等
[解决办法]
要原理,反过来移位就是了
每次>>1,什么时候变成1,原数就是2的几次方
要快速,直接定个长64的数组,{1,2,4,8,……}和{0,1,2,3……}一一对应就完事了
反正int型最大也就是2的64次方,要快速就拿空间换时间
[解决办法]
- C/C++ code
double i; cout<<"输入:"; while(cin>>i) { int count=0; double temp=0; temp=i; while((int)temp%2==0) { count++; temp=temp/2; } cout<<"\t得"<<count<<endl; cout<<"输入:"; } cout<<"结束"<<endl; return 0;
[解决办法]
一方面,你可以建立倍数和移位数之间的一一对应的关系,比如用stl的map可以很轻松地做到这一点。
二方面,可以用你输入的数字,循环地除以2,并设一个计数器,每除一次2计数器就加1,直到商为1为止,比如输入8,要除以3次2才能得到1,所以8所对应的移位数是3,如此而已。一些特殊情况,可分别处理,比如输入为1这样的情况。