gpt4 book ai didi

java - 奇怪的变量赋值方式

转载 作者:搜寻专家 更新时间:2023-11-01 03:56:25 25 4
gpt4 key购买 nike

我一直在使用 C++ 和 Java,在这两种语言中我经常遇到一种奇怪的变量赋值方式,即使用按位运算符。使用赋值运算符可能是一个简单的赋值,而使用左移等位运算符却很复杂。例如,在 Java 的 ServerSocketChannel 类中,我们看到以下分配:

public static final int OP_READ = 1 << 0;
public static final int OP_WRITE = 1 << 2;
public static final int OP_CONNECT = 1 << 3;
public static final int OP_ACCEPT = 1 << 4;

我想在这里了解我们通过使用 << 运算符获得了什么。我们可以进行简单的赋值,将变量分别赋值为 1、4、8、16,如下所示:

public static final int OP_READ = 1;
public static final int OP_WRITE = 4;
public static final int OP_CONNECT = 8;
public static final int OP_ACCEPT = 16;

使用 << 的附加值是多少?接线员在这里?

最佳答案

这是为了清晰/可读性(当重要时)。

在字节码级别,OP_ACCEPT = 16OP_ACCEPT = 1 << 4是同一件事(通过 javap -constants <YourClass> )

只是更容易准确地看到它被移动了多少次。当您执行绑定(bind)到两个操作的幂的不同操作时,通常这很重要。

例如 HashMap (或者我假设 HashXXX 结构),其中,至少在 Java 中,总是在下一个 2 的幂上选择桶。这简化了处理或者可能是合理化,因此桶数声明为:

 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;

同时,where,2的幂,无所谓,变量不是这样声明的:

static final int TREEIFY_THRESHOLD = 8;
static final int MIN_TREEIFY_CAPACITY = 64

想想在 HashMap 的情况下如何选择桶通过(n - 1) & hash , 其中n是桶的数量(总是二的幂)。默认容量为 16(或更好的 1 << 4 ),意味着最后 4 位为零,执行负 1 将使它们全部为 1。所以,在某种程度上1 << 4对于 HashMap将意味着最后 4 位 被考虑在内(直到下一次重新哈希)。现在想想1 << 28例如......如果没有转变,这将是很长的推理。

至少对我来说,对于这种情况,例如做 orand对这些变量会更有意义。

关于java - 奇怪的变量赋值方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49109339/

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