推荐一本书呗

时间:2022-02-18 17:49:06
 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。