Java 有人能解释一下这个代码是如何使用移位的吗?
我正在解决示例问题,同时尝试学习Python%\。。。但是我得到的问题书中有Java的问题和解决方案,所以我尝试在这两种语言之间来回转换。我刚刚了解了位移位是如何工作的,我一直在看这段代码,试图弄清楚第5行(和第8行)到底发生了什么。。。我试着写下一些例子,只是逐行浏览代码,但出于某种原因,我仍然不太清楚。。。 有人能澄清一下吗 另外,据我所知,Java 有人能解释一下这个代码是如何使用移位的吗?,java,python,bit-manipulation,Java,Python,Bit Manipulation,我正在解决示例问题,同时尝试学习Python%\。。。但是我得到的问题书中有Java的问题和解决方案,所以我尝试在这两种语言之间来回转换。我刚刚了解了位移位是如何工作的,我一直在看这段代码,试图弄清楚第5行(和第8行)到底发生了什么。。。我试着写下一些例子,只是逐行浏览代码,但出于某种原因,我仍然不太清楚。。。 有人能澄清一下吗 另外,据我所知,str.charAt(i)返回一个字符,然后你可以继续从另一个字符(如数字)中减去它,这对我来说真的很奇怪。。。对字符应用int是否与Python中的o
str.charAt(i)
返回一个字符,然后你可以继续从另一个字符(如数字)中减去它,这对我来说真的很奇怪。。。对字符应用int
是否与Python中的ord()
相同
问题:实现一个算法来确定字符串是否具有所有唯一字符
解决方案(在仅包含字符a-z的情况下):
1布尔值isUniqueChars(字符串str){
2整数检查器=0
3表示(int i=0;i 8 checker |=(1当然。只有当str
中只有小写字母时,此代码才会真正起作用
checker
是一个32位整数,您正在使用32位中的26位来记录str
中某个特定字母的存在。因此,位0将用于记录a
的存在,位1将用于记录b
的存在,以此类推,直到位25,这将用于记录的存在>z
基本算法是逐个字符处理str
。对于每个字符,在检查器中找到相应的位。如果已经设置,则该字符必须第二次出现-因此我们可以停止处理并返回false
。否则,设置该位
如果到达字符串末尾时未找到任何重复字符,则返回true
神奇之处在于以下步骤
- 从每个字符中减去
'a'
,将其转换为0到25之间的数字
- 符号
当然。只有当str
中只有小写字母时,此代码才会真正起作用
checker
是一个32位整数,您正在使用32位中的26位来记录str
中某个特定字母的存在。因此,位0将用于记录a
的存在,位1将用于记录b
的存在,以此类推,直到位25,这将用于记录的存在>z
基本算法是逐个字符处理str
。对于每个字符,在检查器中找到相应的位。如果已经设置,则该字符必须第二次出现-因此我们可以停止处理并返回false
。否则,设置该位
如果到达字符串末尾时未找到任何重复字符,则返回true
神奇之处在于以下步骤
- 从每个字符中减去
'a'
,将其转换为0到25之间的数字
- 符号
让我们尝试一种更简单的变体:
boolean isUniqueChars(String str) {
boolean[] seen = new boolean[26];
for (int i = 0; i < str.length(); i++) {
// convert char to 0-based offset
int index = str.charAt(i) - 'a';
if (seen[index]) {
// this char was seen already
return false;
}
seen[index] = true;
}
// no duplicates found
return true;
}
boolean isUniqueChars(字符串str){
boolean[]seen=新的boolean[26];
对于(int i=0;i
非常简单,对吗?我们创建一个布尔数组,使用字符偏移量作为索引,然后检查字符串中的每个字符,看看我们是否遇到过它。您发布的代码使用相同的逻辑,但使用了更有效的位集
(1让我们尝试一个更简单的变体:
boolean isUniqueChars(String str) {
boolean[] seen = new boolean[26];
for (int i = 0; i < str.length(); i++) {
// convert char to 0-based offset
int index = str.charAt(i) - 'a';
if (seen[index]) {
// this char was seen already
return false;
}
seen[index] = true;
}
// no duplicates found
return true;
}
boolean isUniqueChars(字符串str){
boolean[]seen=新的boolean[26];
对于(int i=0;i
非常简单,对吗?我们创建一个布尔数组,使用字符偏移量作为索引,然后检查字符串中的每个字符,看看我们是否遇到过它。您发布的代码使用相同的逻辑,但使用了更有效的位集
(1首先,只有当输入字符串包含字母“a”到“z”时,代码才能可靠地工作
变量检查器是一个32位整数。检查器中的每一位都用作标志,指示26个字母“a”到“z”中的一个是否存在
线路
int val = str.charAt(i) - 'a';
通过减去字符“a”的值,将存储在str索引i中的字符转换为存储在val中的整数。是的,我认为pascal有Ord(“”)函数,它也有相同的功能
a = 0
b = 1
c = 2
etc
etc
etc
z = 25
代码
(1 << val)
(1首先,只有当输入字符串包含字母“a”到“z”时,代码才能可靠地工作
变量检查器是一个32位整数。检查器中的每一位都用作标志,指示26个字母“a”到“z”中的一个是否存在
线路
int val = str.charAt(i) - 'a';
通过减去字符“a”的值,将存储在str索引i中的字符转换为存储在val中的整数。是的,我认为pascal有Ord(“”)函数,它也有相同的功能
a = 0
b = 1
c = 2
etc
etc
etc
z = 25
代码
(1 << val)
(1在Java中,字符是整数16位无符号类型和char-char->int
(是两个[通常是BMP中的代码点]之间的整数差)