java - 按位运算检查字符串是否唯一

标签 java string bit-manipulation

这是检查输入字符串是否唯一的代码。第 1 行正在做什么? 11:check |=(1<<val)为什么支票的二进制形式是这样的?

public boolean checkUnique(String str)
 {
     int check=0;
     for(int i=0; i<str.length();i++)
     {
         int val = str.charAt(i)-'a';
         if((check & (1 << val)) >0)
         {
             return false;
         }
         check |= (1<<val);
         System.out.println("check "+Integer.toBinaryString(check));
     }
     return true;
 } 


I/P : "asdfgh"
O/P () : 
0
check 1
18
check 1000000000000000001
3
check 1000000000000001001
5
check 1000000000000101001
6
check 1000000000001101001
7
check 1000000000011101001

最佳答案

这段代码看起来像是在检查字符串中的每个字符是否唯一。

int check=0;初始化'check ' 与 0 ;

int val = str.charAt(i)-'a'; ASCII 字符的最大值为 127,减去“a”即 97,给出 0 - 30 之间的值; [注意,这个函数似乎只能检查大于或等于 'a' (97) 的字符,否则,val 可能会被分配一个负值,这对于稍后的按位移位操作没有意义]。

对于第一次迭代,“if((check & (1 << val)) >0) ”将始终为 false,0 和任何 int 仍将是 0;

然后行“check |= (1 < < val);”左移0x01,位数由“val”指定。例如,如果 val = 3,(1 << val) 将被评估为 0x08。 0 按位或 0x08 将使“检查”值为 0x08;

对于前面的迭代,每次都会生成一个新的“val”,并且“if”子句使用按位与来检查“val”是否已存在。如果存在,则返回 false 函数,否则,在“check”中“记录”新的“val”并继续下一次迭代。当循环结束时,返回true。

关于java - 按位运算检查字符串是否唯一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32173599/

相关文章:

c# - 将 C++ 字符数组转换为 C# 字符串

c - 将整个字符数组移位 N 位

java - 为什么探查器在我没有创建任何 char[] 实例时显示大量实例?

java - Spring Security部署错误

Mac 上针对 Java6 的 JavaFX 构建

string - 如何在 Swift 中拆分字符串

javascript - 为什么我不能在 for-of 循​​环中将更新后的值赋给变量 'word' ?

c# - C#按位运算符

c - 8 位输入给出奇怪的行为,因为 16/32 位给出小端/大端

java - 如何重命名Java的线程