我有上面的方法。所以我的问题是当我通过 10.0 和 10.5 作为参数时,它如何返回 mask = 1048576 ?
答案 0 :(得分:2)
从我所看到的情况来看,你使用i == 20
进行一次循环。
(ulong)1 << 20 == 1048576
要将其分解 - 10.0 * 2 == 20.0
和10.5 * 2 == 21.0
。
你的for循环基本上是for(var i = 20; i < 21; i++)
。
然后or
归零mask
值,结果为i << 20
,即1048576
并退出循环。
按预期工作。
右移位运算符<<
有两个参数 - 要移位的值和多少。
要理解它,你需要用二进制思考,用二进制表示事物。
例如,使用4位,您会看到1
表示为:
0001
如果你把它移到两个地方:
1 << 2
你得到:
0100
小数为4
。这同样适用于<< 20
,它将所有位20位置向左移动(丢弃溢出位)。
100000000000000000000 (binary) == 1048576 (decimal)