推荐一本书呗
1 #include <iostream> 2 #include <vector> 3 #include <bitset> 4 5 using namespace std; 6 7 int main() 8 { 9 cout << "Hello world!" << endl; 10 int j=0; 11 vector<int> vect; 12 for(int i=0;i<100;i++) 13 { 14 j = i << 2; 15 vect.push_back(j); 16 } 17 vector<int>::iterator begin = vect.begin(); 18 while(begin!=vect.end()) 19 { 20 cout << *begin++ << " "; 21 } 22 cout << endl; 23 24 bitset<1000> b1(0); 25 b1.reset(); 26 b1.set(1); 27 cout << b1.any() << endl; 28 cout << b1.all() << endl; 29 cout << b1.test(1) << endl; 30 bitset<1000> b2 = b1; 31 cout << b2.test(1) << endl; 32 33 int result = (21 >> 3) + (21 >> 6) +1; 34 cout << "21/7: " << result << endl; 35 return 0; 36 }
只想说一下第33行的算法,当整数i/7 时,可以用这个方式:(i>>3) + (i>>6) +1。 原理如下:
1 除法可以用移位来代替。
2 除7的话,没法移位,那就换成除8,右移3位。
3 除7和除8之间的差距是 1/7 - 1/8= 1/56.
4 弥补这个差距,所以要加上 i/56 。用移位的话,只能右移6位,也就是除64. 2^6 = 64。
5 上一步的差距就是 1/56 - 1/64。这个我们就当作误差来处理。
6 最后加1, 原因是每次移位后,余数大致等于0.5. 两次移位下来就丢了1. 以21 为例,21/8=2(余数大致为0.5),21/64=0(余数大致为0.5).
以上的算法,来自JDK源代码,但是源代码的算法来自于一本书<<hacker's delight>>。 这本书讲解了各种移位操作的经验。很多JDK开发者也都是看了这本书。
另外有一个传说,现在流行的hadoop框架作者jeff dean 送给正在学习编程的女儿了两本书,一本是 hacker's delight 另一本就是 taocp。