首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >位操作--为第一个N组位生成掩码

位操作--为第一个N组位生成掩码
EN

Stack Overflow用户
提问于 2021-02-28 02:40:55
回答 3查看 376关注 0票数 4

我想知道是否有一个有效的算法实现来解决以下问题:

给定一个无符号整数U,制作一个掩码,选择所设置的U的第一个N位。(从右到左,从低到高)

例如:

代码语言:javascript
复制
f(U=1111, N=2) -> 0011
f(U=1010, N=2) -> 1010
f(U=1110, N=2) -> 0110
f(U=0111, N=2) -> 0011
f(U=0011, N=2) -> 0011

大多数处理器都有“查找第一集位”或类似的指令,所以我认为在最坏的情况下,我可以调用N次,但还能做得更好吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-02-28 08:40:42

最近的一些CPU有pdep指令,这很容易做到:

代码语言:javascript
复制
m = bitmask of n ones
return pdep(m, x)

否则,一种逐步的方法,如@olegarch的解决方案,可能是不可避免的。指令较少的一项如下:

代码语言:javascript
复制
unsigned getmask(unsigned x, int n) {
    unsigned x1 = -x;
    for (int i = 0; i < n - 1; ++i)
        x1 = x1 - (x ^ x1);
    return x & x1;
}
票数 3
EN

Stack Overflow用户

发布于 2021-02-28 09:42:13

猜测位,并使用内置的波普计数来测试猜测。如果我们认为内置的波普计数为O(1),那么复杂度将是O(log )(带有二进制搜索)。

票数 2
EN

Stack Overflow用户

发布于 2021-02-28 03:17:58

代码语言:javascript
复制
int getmask(unsigned int U, int n) {
      unsigned int m = U;
      do {
        m &= m - 1;
      } while(m && --n);
      return U & ~m; 
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66405359

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档