我只是想学习按位/移位操作。我遇到了下面的程序,但是不理解下面程序中的AND条件部分(检查器和(1 输入样例:xyzz样本输出:8388608价值0检查0最终值16777216值8388608检查器0最终值33554432价值25165824检查器0最终值33554432价值58720256检查器33554432最终值public static boolean isUniqueChars(String str) { int checker = 0; for (int i = 0; i < str.length(); i++) { int val = str.charAt(i) - 'a'; System.out.println((1 << val) + "Value"); System.out.println((checker) + "checker"); System.out.println(((checker & (1 << val))) + "final value\n"); if ((checker & (1 << val)) > 0) { return false; } else { checker = checker | (1 << val); } } return true; }} 最佳答案 好的,只是要确保您知道发生了什么事情:int val = str.charAt(i) - 'a';假设使用英文字母,这是将您的(小写)字母的char值减去97(“ a”的char值)后得出的数字介于0和25之间(含0和25)。不要在大写字符上尝试此功能,除非在.toLowerCase()之后添加.charAt(i),否则会得到错误提示1 << val向左移1 val个位。例如,对于“ x”(120-97 = 23,所以... 1 << 23),二进制表示形式为00000000010000000000000000000000好,到目前为止和我在一起吗?首先,checker的所有位均为0,所以它是00000000000000000000000000000000所以...让我们输入数字而不是变量。对于我们的x检查,由于未在checker中设置位23,所以checker & (1 << val)变为00000000000000000000000000000000 & 00000000010000000000000000000000等于00000000000000000000000000000000。因此,一旦处理完x,我们将第23位添加到检查器中,然后移至下一个字母:y这次,checker & (1 << val)变为00000000010000000000000000000000 & 00000000100000000000000000000000,它等于00000000000000000000000000000000,因为未在检查器中设置第24位。对于第一个z,checker & (1 << val)变为00000000110000000000000000000000 & 00000001000000000000000000000000,它等于00000000000000000000000000000000,因为未在checker中设置25位。对于第二个z,由于在checker中设置了位25,所以checker & (1 << val)等于00000001110000000000000000000000 & 00000001000000000000000000000000(十进制33554432或2 ^ 25),因此00000001000000000000000000000000现在为> 0,并且函数返回。关于java - 位移位-需要帮助以了解代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15909949/
10-10 10:07