【问题标题】:How do you define a variable with an OR operator in java如何在 java 中使用 OR 运算符定义变量
【发布时间】:2015-04-04 20:23:34
【问题描述】:
private static long permute(byte[] table, int srcWidth, long src) {
    long dst = 0;
    for (int i=0; i<table.length; i++) {
        int srcPos = srcWidth - table[i];
        dst = (dst<<1) | (src>>srcPos & 0x01);
    }
    return dst;
}

这里 dst = (dst>srcPos & 0x01);这是如何运作的??我假设 |是 OR 运算符吗?

【问题讨论】:

  • 这不是定义变量。而| 就是bitwise inclusive or operator。当您问“这是如何工作的”时,您想知道什么?
  • 它将dst 左移 1 位,然后按位或与src 一起执行。从左到右考虑每个操作。
  • @AndyTurner 你能简要解释一下我特别标记的那行是如何工作的吗?
  • @user2475511 你有什么不明白的地方? | 运算符如何工作,或者整个表达式如何组合在一起?如果是后者,请记住 | 仅适用于两个数字。 dst &lt;&lt; 1 是一个数字,src &gt;&gt;srcPos &amp; 0x01 也是。这与dst = (dst + 1) * ( (src + srcPos) / 0x01) 之类的内容基本上没有什么不同,只是运算符不同且不太熟悉。

标签: java variables operator-keyword


【解决方案1】:

考虑按位“与”和“或”操作的一种方法是设置(打开)和重置(关闭)结果中的位。

您将一个操作数视为您的“掩码”——一个和零表示需要设置或重置的内容。另一个操作数将被那个“掩码”“掩码”。方式如下:

如果操作符是&amp;,那么“掩码”中的每一位为零,在结果中都将为零。为 1 的每个位都将具有来自另一个操作数的值。

例如result = x &amp; 0b11111111_11111111_11111111_11110111(那个大数字是我们的掩码,我以二进制形式显示)将具有与x相同的所有位,除了右边的第四位,这是为0,无论x中是0还是1。

因此使用“掩码”执行&amp; 被认为是“位重置”操作或“归零”操作。

对于|(或)运算符,您可以将其视为“位集”操作。掩码中为 1 的每一位将在结果中为 1。为 0 的每一位都将包含另一个操作数中的任何内容。所以在结果中,掩码中所有为 1 的位都将被设置。

例如,result = x | 0b1000 将包含 x 中的所有位,除了右边的第四位,无论它在 x 中是什么,它都将为 1。

用二进制编写掩码很长,并且在 Java 中是最近才出现的,因此您更有可能看到用十六进制编写的掩码。在这种情况下,0xfffffff7 用于&amp; 示例,0x8 用于| 示例。

现在让我们用“面具”的角度来看你的表达:

  • dst&lt;&lt;1 表示将dst 移位1。它的所有位都向左移动一位,最右边的位设置为零。从本质上讲,这是为最右边的东西“腾出空间”。
  • 在右括号中,移位运算符具有优先级,因此首先计算它。 src 向右移动 srcPos 位置。所以从右边开始的srcPos+1 位现在是最右边的位。
  • 现在我们用0x01“屏蔽”它。即0b00000000_00000000_00000000_00000001。这是一个&amp; 掩码,所以所有不是最右边的位都将为零。只有最右边的位被保存。最终结果是,它是曾经位于 src 中的 srcPos+1 位置的位,并且该位 - 所有其余部分都被重置。
  • 现在我们用我们准备好的dst&lt;&lt;1 来“掩盖”它。因为它是一个| 操作,所以它是一个“设置”掩码。我们的掩码只有一个有效位——我们在&amp; 操作中没有擦除的那个。它在最右边的位置。如果为 1,则结果为 1,如果为 0,则结​​果为 0(因为左操作数在该位置为零)。

所以基本上它的作用是:

  • dst 中的位推到左侧。
  • 将来自srcPos + 1 个位置的位放在它的最右边。

如果table 中的值都是介于 0 和 srcWidth 之间的唯一位置,那么这将为您提供src 位的加扰 - 在每一轮中,一位将被推入dst,基于table[i] 的值。

【讨论】:

    【解决方案2】:

    " | " 是二进制或运算符,如果它存在于任一操作数中,则复制一个位。 举个例子:

    A|B
    

    将给出 61,即 0011 1101。

    “||”称为逻辑或运算符。如果两个操作数中的任何一个不为零,则条件为真。例如:

    (A || B) 为真。

    【讨论】:

      【解决方案3】:

      | 是按位或而不是逻辑或

      按位或单独对该 long 中的每个位进行运算。这改变了它的价值,这与定义它不同。

      分解这条线:

      dst = (dst<<1) | (src>>srcPos & 0x01);
      

      dst<<1 // means left shift 1 place.  The same as multiply by 2.  Zeros lowest bit.
      
      src>>srcPos // means right shift srcPos places.  The same as divide by 2 to the srcPos
                  // this puts the selected bit in the lowest place
      
      & 0x01 // means set every bit to zero except the rightmost one which will stay the same
      
      (src>>srcPos & 0x01) // means give me the value of the src bit at srcPos
      
      (dst<<1) | (src>>srcPos & 0x01); // means shift dst left and put a src bit at the end
      

      这里的按位 OR 就像是在附加一点。这只有效,因为不会使用的位已在每一侧仔细归零。

      随着循环的进行,table 正在控制从src 中采样的位,并且它选择的任何内容都附加到dst 的右端。因此table 控制src 的排列方式。

      【讨论】:

        猜你喜欢
        • 2022-11-17
        • 2011-08-08
        • 1970-01-01
        • 1970-01-01
        • 2018-11-11
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多