推荐一本书呗

 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。

 

posted on 2017-08-17 11:03  ^~~^  阅读(172)  评论(0编辑  收藏  举报

导航