首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BitSet LeftShift回绕问题

BitSet LeftShift回绕问题
EN

Stack Overflow用户
提问于 2016-05-13 08:18:00
回答 1查看 326关注 0票数 0

我正在尝试使用BitSet在Java语言中创建一个使用wrap进行左移的方法,但我不知道如何让它进行wrap。现在,我的方法只删除了第一位,并保留了其余的位,而没有将第一位添加到末尾。

代码语言:javascript
复制
public static BitSet leftShift(int amount, BitSet b){
    BitSet bit2 = new BitSet(b.length());

    for(int i = b.length(); i > 0; i--){
        bit2.set((i-amount)%b.length(), b.get(i));
    }
    return bit2;
}
EN

回答 1

Stack Overflow用户

发布于 2016-05-13 08:44:26

你的代码中有两个问题。

循环边界中的

  1. off-by-one错误。BitSet索引是从零开始的。所以你应该从b.length() - 1开始,计数到i >= 0,或者更好,但是不要尝试非常规的,而是做通常的for (int i = 0; i < b.length(); i++)
  2. Your索引计算,不会绕过负数。解决这个问题的一个简单方法是在取模之前添加b.length()(i + b.length() - amount) % b.length()

最后,虽然这不是一个bug,但遍历BitSet的常用方法是使用nextSetBit,而不是遍历所有索引。

综合来看,它看起来像这样:

代码语言:javascript
复制
BitSet result = new BitSet(b.length());

for (int i = b.nextSetBit(0); i != -1; i = b.nextSetBit(i + 1)) {
    int j = (i + b.length() - amount) % b.length();  // new index after wrapping
    result.set(j);
}
return result;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37199396

复制
相关文章

相似问题

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