Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有人能解释一下这个代码是如何使用移位的吗?_Java_Python_Bit Manipulation - Fatal编程技术网

Java 有人能解释一下这个代码是如何使用移位的吗?

Java 有人能解释一下这个代码是如何使用移位的吗?,java,python,bit-manipulation,Java,Python,Bit Manipulation,我正在解决示例问题,同时尝试学习Python%\。。。但是我得到的问题书中有Java的问题和解决方案,所以我尝试在这两种语言之间来回转换。我刚刚了解了位移位是如何工作的,我一直在看这段代码,试图弄清楚第5行(和第8行)到底发生了什么。。。我试着写下一些例子,只是逐行浏览代码,但出于某种原因,我仍然不太清楚。。。 有人能澄清一下吗 另外,据我所知,str.charAt(i)返回一个字符,然后你可以继续从另一个字符(如数字)中减去它,这对我来说真的很奇怪。。。对字符应用int是否与Python中的o

我正在解决示例问题,同时尝试学习Python%\。。。但是我得到的问题书中有Java的问题和解决方案,所以我尝试在这两种语言之间来回转换。我刚刚了解了位移位是如何工作的,我一直在看这段代码,试图弄清楚第5行(和第8行)到底发生了什么。。。我试着写下一些例子,只是逐行浏览代码,但出于某种原因,我仍然不太清楚。。。 有人能澄清一下吗

另外,据我所知,
str.charAt(i)
返回一个字符,然后你可以继续从另一个字符(如数字)中减去它,这对我来说真的很奇怪。。。对字符应用
int
是否与Python中的
ord()
相同

问题:实现一个算法来确定字符串是否具有所有唯一字符

解决方案(在仅包含字符a-z的情况下):

1布尔值isUniqueChars(字符串str){
2整数检查器=0
3表示(int i=0;i8 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中的代码点]之间的整数差)