[技巧]不使用算术运算符让一个数加一(用位运算)

代码如下:

 

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)),显然这是成立的。

 

 

 

 

一些感想

  1. 鄙视一个人并不会让你得到什么,相反,你有可能得罪到别人。
  2. 当你受打击时侯,去做其他事吧,不要再回忆以前受打击的经历,那只会让你的心情更糟。
  3. 当你遇到别人问一个你觉得很简单的问题时,尽量不要嘲笑或者鄙视,你可以选择沉默,因为有些细节你无法了解。
  4. 如果你对别人的鄙视或者嘲笑感到不爽,保持沉默吧,用行动才是最好的回应方式。
  5. 多做实事。