具有移位和运算符的独特字符:不理解此代码

时间:2012-05-28 12:28:12

标签: java operators bit-shift

我不理解循环中的行:我们取字符并减去a,所以“10”? (为什么?)
那么1 << val:我们用val换1? (为什么?)
和检查器是0,那么我们如何在条件中达到> 0

    public static boolean isUniqueChars(String str) {
    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;
}

由于

3 个答案:

答案 0 :(得分:7)

代码假定str由小写字母组成,如果没有重复字母则返回true。它的工作原理如下:

checker用作位图,也就是说,此变量中的每个位用于跟踪一个字母。从字符中减去“a”给出'a'为0,为'b'为1,为'c'为2等。将此数字左移1为'a',2为'b',4为'c' '等等。

通过oring(|)此值与checker代码会跟踪以前遇到的字符。所以,如果我们遇到第二个'a',例如checker有第一个位集(在if语句中由&测试),所以我们知道str有重复

简而言之,checker被用作更快更紧凑的bool数组。这种和类似的技术称为bit manipulation

答案 1 :(得分:1)

str.charAt(i) - 'a'或多或少地返回“字母表中的字母”:如果str.charAt(i)'a',则为0,如果是'b'val1,如果zval25,依此类推。

其余部分使用了一种比特笨拙的技术:如果val的{​​{1}}位是checker,那么我们已经看到1个字符已经。因此val非零,当且仅当checker & (1 << val) val置位时,这意味着我们已经看过该字符。否则,我们设置checker的{​​{1}}位并继续循环。

答案 2 :(得分:0)

问题已经很久了,但我认为我的回答是正确和清晰的。 我们只在这种情况下处理小写字母。 就像保罗所问的那样,library(ggplot2) library(shiny) runApp(shinyApp( ui = fluidPage( plotOutput("plot", brush = brushOpts("plotBrush", delay = 5000)), actionButton("clear", "Clear") ), server = function(input, output, session) { values <- reactiveValues(brush = NULL) output$plot <- renderPlot({ ggplot(cars, aes(speed, dist)) + geom_point() }) brush <- reactive({ input$plotBrush }) observeEvent(input$clear, { cat(str(brush())) # clear the brushed area }) } )) 意味着转移第一个方向。不要转移&#39; val&#39;一个人。例如,&#39;你好&#39;给出:

(1 << val)

我希望这可以解决问题。 如果您想确切了解发生了什么,我会得到源代码。

1st loop: val = 111 in binary, 7 in decimal
          1 << val = 10000000  <-- here one is shifted by 7
          checker = 10000000 
2nd loop: val = 100 in binary, 4 in decimal
          1 << val = 10000
          checker = 10010000
3rd loop: val = 1011 in binary, 11 in decimal
          1 << val = 100000000000
          checker = 100010010000
4th loop: val = 1011 in binary, 11 in decimal
          1 << val = 100000000000
         (checker & (1 << val)) gives 100000000000 which is greater than 0
The loop is over because 'l' is not unique after 'hel' in 'hello'.