我对位向量如何工作感到困惑(对位向量不太熟悉).下面是给出的代码.有人能带我看一下吗?

public static boolean isUniqueChars(String str) {
    int checker = 0;
    for (int i = 0; i < str.length(); ++i) {
        int val = str.charAt(i) - 'a';
        if ((checker & (1 << val)) > 0) return false;
        checker |= (1 << val);
    }
    return true;
}

特别是这checker人在做什么呢?

推荐答案

这里使用int checker作为比特的存储器.整数值中的每一位都可以视为一个标志,因此int最终是一个位数组(标志).代码中的每一位都声明是否在字符串中找到了带有位索引的字符.出于同样的原因,您可以使用位向量来代替int.它们之间有两个不同之处:

  • Size.int有固定的大小,通常是4字节,这意味着8*4=32位(标志).位向量通常可以是不同的大小,或者您应该在构造函数中指定大小.

  • API美元.使用位向量,您将更容易阅读代码,可能如下所示:

    vector.SetFlag(4, true); // set flag at index 4 as true

    对于int,您将有较低级别的位逻辑代码:

    checker |= (1 << 5); // set flag at index 5 to true

另外,int可能会快一点,因为带位的操作级别非常低,可以由CPU按原样执行.BitVector允许编写稍微不那么神秘的代码,而且可以存储更多标志.

供将来参考:位向量也称为bitSet或bitArray.以下是不同语言/平台的此数据 struct 的一些链接:

Java相关问答推荐

使用ExecutorService时在ThreadFactory中触发自定义newThread函数

如果给定层次 struct 级别,如何从其预序穿越构造n元树

如何将kotlin代码转换为java

如何使用AWS CLI从S3存储桶中的所有对象中删除用户定义的元数据?

在JavaFX项目中注册组合框的控件FX验证器时,模块系统出错

使用传递的参数构造异常的Mockito-doThrow(或thenThrow)

如何在EXCEL单元格中添加形状和文本

如何从Keyloak映射Hibernate实体中的用户

Jenv-相同的Java版本,但带有前缀

继续收到错误SQLJDBC EXCEPTION执行";org.springframework.dao.InvalidDataAccessResourceUsageException:&

将ByteBuffer异步写入InputStream或Channel或类似对象

Java 11 HttpCookie.parse在解析包含JSON的Cookie时引发IlLegalArgumentException

删除打印语句会影响功能...腐败在起作用?

在JDK Flight Recorder中只记录单个线程

对角线填充二维数组

有没有办法知道在合并中执行了什么操作?

如何从命令行编译包中的所有类?

Win32函数的JNA绑定DwmGetColorizationColor返回E_INVALIDARG错误

如何正确使用java.time类?

@此处不能应用可为null的批注