[技巧]不使用算术运算符让一个数加一(用位运算)
代码如下:
int add(int n) { // 这里假设n>=0,不过对于n<0的情况也是成立的 int c=1; int d; while(c!=0) { d=n&c; n=n^c; c=d<<1; } return n; }
原理就是:
对于一个二进制编码的数字,想要加一可以这样做:从最低位开始向最高位寻找第一个位为0的位,将这个位置1,而后边的位全部置0。
[算法] check divisibility
看到一个算法题:不使用除法运算符(/)和模运算(%)判断一个数是否被形如2^n-1的数整除。
代码如下:
int checkdiv(int n,int k) { // 返回 n%(2^k-1)的结果 // n>=0,k>=2 if(n == 0) return 0; int m = (1<<k)-1; // m=2^k-1 while(n > m) { n = (n>>k) + (n&m); } if(m == n) return 0; else // m>n return n; }
原理如下:
n可以表示为
n=(n>>k)*(1<<k)+(n&m)
因此只需证明((n>>k)*(2^k)) ≡ (n>>k) (mod (2^k-1)),显然这是成立的。
一些感想
- 鄙视一个人并不会让你得到什么,相反,你有可能得罪到别人。
- 当你受打击时侯,去做其他事吧,不要再回忆以前受打击的经历,那只会让你的心情更糟。
- 当你遇到别人问一个你觉得很简单的问题时,尽量不要嘲笑或者鄙视,你可以选择沉默,因为有些细节你无法了解。
- 如果你对别人的鄙视或者嘲笑感到不爽,保持沉默吧,用行动才是最好的回应方式。
- 多做实事。