关于位运算中不太显眼的一个问题

我们都知道, C++中size_t 的本来面目是unsigned int

而一般情况下, size_t是4bytes, 所以size_t 的范围是[0, 2^32 - 1]  (注:这是一个循环范围, "^" 为数学中的幂运算符)

那么怎样才能得到用一个size_t 类型变量得到(2^32 - 1)这个值呢


a.最快的方法是:

size_t i = 0;

--i;


b.那么,如果是这样呢:

size_t i = 1;

i <<= 32;

--i;

EXPECT_EQ(?, i);


c.这样呢:

size_t i = 1;

i <<= 31;

i <<= 1;

--i;

EXPECT_EQ(?, i);


d.再来一个:

size_t i = 1;

i <<= 31;

--i;

i <<= 1;

++i;

EXPECT_EQ(?, i);


答案是这样的:

a. (2^32 - 1)

b. 0

c. (2^32 - 1)

d. (2^32 - 1)


是的,b的结果是0

为什么呢?

其实很简单,如果让你去实现移位操作,你会怎么做?

你是不是会先通过类型知道这个变量最多可移多少位?(假设最多可移m位)

那么当用户程序想移n位时,我们可以通过这种方式得到用户程序实际能或想移动的位数:

n %= m; (求余)

所以,

当你要求移动31位时,实际上相当于移动了31位

当你要求移动32位时,实际上相当于移动了0位

当你要求移动33位时,实际上相当于移动了1位


这就是问题的根源了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值