C 中的位旋转:如何从 2^N 转换为 N?

发布于 2024-10-03 01:23:41 字数 342 浏览 3 评论 0原文

将 [2^N,2^(N-1)-1] 范围内的数字转换为 N 的良好位操作例程是什么?

一些例子:

  • f(1) -> 0
  • f([2-3]) -> 0 f([2-3]) -> 1
  • f([4-7])→ 2
  • f([8-15])→ 3

这是一种实现:

uint f(uint num)
{
    for (uint shifts = 0; num; shifts++) 
        num >>= 1;
    return (shifts - 1);
}

What is a good bit-twiddling routine to convert a number in the range [2^N,2^(N-1)-1] to N?

Some examples:

  • f(1) -> 0
  • f([2-3]) -> 1
  • f([4-7]) -> 2
  • f([8-15]) -> 3

Here is one implementation:

uint f(uint num)
{
    for (uint shifts = 0; num; shifts++) 
        num >>= 1;
    return (shifts - 1);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

云之铃。 2024-10-10 01:23:42

作为最通用的方法,二分搜索可能会有所帮助。对于值 0..31,仅需要 5 个阶段。

y = 0;
if(x >= 0x10000<<y) y += 0x10;
if(x >= 0x100<<y) y += 0x08;
if(x >= 0x10<<y) y += 0x04;
if(x >= 0x4<<y) y += 0x02;
if(x >= 0x2<<y) y += 0x01;

As most general approach, binary search may help. For values 0..31 it need only 5 stages.

y = 0;
if(x >= 0x10000<<y) y += 0x10;
if(x >= 0x100<<y) y += 0x08;
if(x >= 0x10<<y) y += 0x04;
if(x >= 0x4<<y) y += 0x02;
if(x >= 0x2<<y) y += 0x01;
原野 2024-10-10 01:23:42

在此页面上查看计算以 2 为底的对数(或前导零计数,它们是相同的)的 hack:http://www-graphics.stanford.edu/~seander/bithacks.html

您还可以发现有用的函数__builtin_clz(或_BitScanReverse 对于 VS) 对于 x86。

Take a look at hacks for computing base 2 logarithm (or leading zero count, they are the same) on this page: http://www-graphics.stanford.edu/~seander/bithacks.html

You could also find useful the function __builtin_clz (or _BitScanReverse for VS) for x86.

以酷 2024-10-10 01:23:41

根据您的数据类型的宽度以及可用内存的大小,查找表是一种可能性。这几乎肯定是最快的方法。

有关其他方法,请参阅 http://www-graphics.stanford.edu/~ seander/bithacks.html#IntegerLogObvious 以及后续部分。

Depending on how wide your data-type is, and how much memory you have available, a lookup-table is one possibility. It's almost certainly the fastest approach.

For other approaches, see http://www-graphics.stanford.edu/~seander/bithacks.html#IntegerLogObvious, and the subsequent sections.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文