按位取反移位运算符 / 二的幂次方

5

我在我的C#程序中有以下简单的方程式,用于将一个数字转换为相应的值:

sectorSize = 1 << sectorShift;

是否有一种反向操作可以使我反过来做同样的事情?

sectorShift = ???

我知道你可以用循环实现,但这有点过火了。我以前从未遇到过这种情况,所以不知道该怎么做,也在网上找不到任何关于它的信息。我只需要的方程式在sectorSize为2的幂时才能产生有效结果;其他范围对我来说都无所谓。


1
<< 的反转是 >> 吗?还是你指的是其他什么? - Matt Burland
位移操作只会给你二的整数次幂的运算。<<是左移,>>是右移。 - Marc B
@MattBurland 不是技术上正确的。Inverse 的意思是“撤销另一个函数的函数”。由于溢出,在 C# 中这并不总是成立:(Int32.MaxValue << 1) >> 1 != Int32.MaxValue - Chris Shain
1
我知道你可以实现一个循环,但那有点过度了。怎么做一些简单易懂、清晰易懂、易于维护的事情就是过度了呢?而做一些连自己都不理解的事情却不是? - jason
1
很遗憾,.net没有公开BSR / BitscanReverse指令。这是一个汇编指令,告诉您最高位的索引。 - CodesInChaos
显示剩余7条评论
2个回答

11

使用循环时,必须注意中止条件。您提供的向下循环不会遇到这样的问题,但是对于计数上升并将 1 << i 与输入进行比较的循环,可能会在处理大量输入时出现问题。 - CodesInChaos
@CodeInChaos:是的。这就是为什么我说“要非常小心”的原因。位运算很容易出错。 - Eric Lippert

10

对数。但是如果您不想使用对数,可以使用循环和/或查找表。


7
更具体地说,x = 1 << n 意味着 x = 2^n。要从 x 中获取 n,你需要计算 n = Log(x, 2)。 - Nico Schertler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接