gpt4 book ai didi

java - java中如何使用OR运算符定义变量

转载 作者:行者123 更新时间:2023-12-01 16:58:48 26 4
gpt4 key购买 nike

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<<1) | (src>>srcPos & 0x01);这是如何运作的??我假设|是 OR 运算符吗?

最佳答案

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

您将一个操作数视为您的“掩码” - 代表需要设置或重置的内容的 1 和 0。另一个操作数将被该“掩码”“掩蔽”。通过以下方式:

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

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

这样做&带有“掩码”的操作被认为是“位重置”操作,或“归零”操作。

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

例如result = x | 0b1000将拥有 x 中的所有位,但右侧第四位除外,无论 x 中的内容是什么,该位都将为 1。

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

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

  • dst<<1意味着转移dst减 1。所有位向左移动一位,最右边的位设置为零。本质上,这是为最右边的某些内容“腾出空间”。
  • 在右括号中,移位运算符具有优先级,因此首先对其求值。 src已移动srcPos位置向右。所以这就是 srcPos+1从右边开始的位置现在是最右边的位。
  • 现在我们用0x01“掩盖”它。即0b00000000_00000000_00000000_00000001 。这是&掩码,因此除了最右边的位之外的所有内容都将为零。仅保存最右边的位。最终结果是它曾经位于 srcPos+1 中。放置在 src ,并且该位 - 所有其余部分均被重置。
  • 现在我们用dst<<1“掩盖”这一点我们准备的东西。因为它是|操作,它是一个“设置”掩码。我们的掩码只有一个有效位 - 我们在 & 中没有删除的那个位。手术。而且它位于最右边的位置。如果为 1,则结果为 1,如果为 0,则结​​果为 0(因为左操作数在该位置为零)。

所以基本上它的作用是:

  • 将位插入 dst向左。
  • 放置 srcPos 中的位+ 从右边算起 1 个位置,位于最右边的位。

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

关于java - java中如何使用OR运算符定义变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29451046/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com