有人可以解释一下这个代码片段的工作原理,该代码片段说明给定的单词是否唯一?
public static boolean isUniqueChars(String str) {
if (str.length() > 128) {
return false;
}
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;
}
我不明白以下两行中发生了什么:
if ((checker & (1 << val)) > 0) return false;
checker |= (1 << val);
谢谢!
答案 0 :(得分:0)
Checker的行为类似于布尔数组。此数组的每个元素都存储是否使用字符。
因此,checker|= (1 << Val)
将一个字符存储到array.and if
语句中,检查是否使用了此字符。
但似乎很奇怪:< 128
比较。因为int的长度是32位。
答案 1 :(得分:0)
要了解它在bit level中的工作方式,请输入Integer.toBinaryString()并检查。基本上,无论何时在任何积分值中使用位运算符,实际操作都会发生在相应的二进制值上。
public static boolean isUniqueChars(String str) {
if (str.length() > 128) {
return false;
} int checker = 0;
for (int i = 0; i < str.length(); i++) {
int val = str.charAt(i) - 'a';
System.out.println("Actual Value " + val); // ASCII substraction
System.out.println("Actual Value in Binary " + Integer.toBinaryString(val));
System.out.println("Left Shift Value in Binary " + Integer.toBinaryString(1<<val));
System.out.println("Operator Value is" + Integer.toBinaryString(checker & (1 << val))));
if ((checker & (1 << val)) > 0)
return false;
checker |= (1 << val); // checker = checker | (1<<val)
System.out.println("Checker Value in Binary " + Integer.toBinaryString(checker));
}
return true;
}
运行此命令并检查那些print语句,然后您可以识别位操作符的工作方式。
逻辑值: 每次左移一个ASCII减去的值,然后用前一个检查值完成BIT(或)。如果当前和检查值BIT(或)返回&gt; 0表示该值的某个位位置为1.因此它是重复的char。我知道这听起来并不复杂,但要花时间调试它。
希望它可以帮到你。