CJson中一个十分有趣的二进制转换

先上代码段

static int pow2gt (int x)	
{
	--x;
	x|=x>>1;
	x|=x>>2;	
	x|=x>>4;	
	x|=x>>8;	
	x|=x>>16;	
	return x+1;	
}

这段代码是取任意一个数字的最小2的N次幂,因为计算机内存是以二进制来存储的,因此在一些内存申请中可以简化,并且可以运用到其他的方面。

先看原理介绍。–x 和 末尾的 x+1可以防止溢出(个人认识),x|x>>1;是将x转化为二进制然后向右移动位数(这里移动一位),然后取或运算符,可以将其设置为1最后可以得到从1开始的数字。这是二进制运算中的按或运算符,接下来以2147483648为例(–x后得到的数字),2147483648在计算机中以二进制储存是10000000 00000000 00000000 00000000 (int为四字节,因此有32位),
11000000 00000000 00000000 00000000 x|x>>1
11110000 00000000 00000000 00000000 x|x>>2
11111111 00000000 00000000 00000000 x|x>>4
11111111 11111111 00000000 00000000 x|x>>8
11111111 11111111 11111111 11111111 x|x>>16
``因为二进制转化为十进制是通过幂来累加的,这样可以做到最高位后的所有位数都为1,即最终结果得到了大于2的最小二次幂。如果有兴趣的读者可以自己实践实践,例如代入4,5,6进行求最终结果,会发现这是非常奇妙的`

若有一些不正确的地方欢迎大家批评指正。

猜你喜欢

转载自blog.csdn.net/u014146044/article/details/106202723