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进行求最终结果,会发现这是非常奇妙的`

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值