我看过一段关于enum的Java代码
public enum Classname {
UIViewAutoresizingNone(0),
UIViewAutoresizingFlexibleLeftMargin(1 << 0),
UIViewAutoresizingFlexibleWidth(1 << 1),
UIViewAutoresizingFlexibleRightMargin(1 << 2),
UIViewAutoresizingFlexibleTopMargin(1 << 3),
UIViewAutoresizingFlexibleHeight(1 << 4),
UIViewAutoresizingFlexibleBottomMargin(1 << 5);
private int value;
// constructor
private Classname(int v) {
this.value = v;
}
public int value() {
return value;
}
}
System.out.println(Classname.UIViewAutoresizingFlexibleBottomMargin.value);输出: 32
我想结果是2的5次方。
通常情况下,如果是
i << j 表示(i << j)是什么意思?I和J如何影响结果?有人能给我指个教程吗?
发布于 2013-04-24 08:00:24
在Java语言中,<<操作符是left bit-shift operator。例如,i为1,位为00000001。位向左移位(j)为5:00100000,即32。将位向左移位是将整数值乘以2的幂的快速方法。
此外,我应该提到这里使用的数据类型int是32位,而不是8位(为简单起见,我在上面显示了最低的8位)。如果您不小心,也可能会将位“移出”末尾并丢失它们。
发布于 2013-04-24 08:04:21
<<是左移位运算符。如果你把一个整数看作一个二进制字符串,它会将字符串向左移位1,并切掉最左边的位(即0b000101变成了0b01010)。就基本算术而言,不包括溢出,这相当于2的乘法。因此,1<<5是0b100000、2^5或32。
在表达式i<<j中,i是被操作的基数,其中j是发生的移位数。当i为1时,如您的示例所示,1<<n将创建一个二进制字符串,其中设置了n+1th位,但没有设置其他位。这很有用,因为您可以将这些字符串添加在一起,并检查每个单独的位,以查看该特定选项是否处于打开状态。
发布于 2013-04-24 08:19:13
Java枚举是类。它们可以有实例变量,尽管将它们设置为可写是非常不好的形式。构造函数
private Classname(int v) {
this.value = v;
}表示必须使用int值构造Classname实例。声明UIViewAutoresizingNone(0)将UIViewAutoresizingNone的值设置为0,可能是为了处理外部代码。
然而,在Java中这是一种有点愚蠢的方式。在C语言中,我们可以写一个类似的枚举:
typedef enum {
UIViewAutoresizingNone = 0,
UIViewAutoresizingFlexibleLeftMargin = 1 << 0,
UIViewAutoresizingFlexibleWidth = 1 << 1,
UIViewAutoresizingFlexibleRightMargin = 1 << 2,
UIViewAutoresizingFlexibleTopMargin = 1 << 3,
UIViewAutoresizingFlexibleHeight = 1 << 4,
UIViewAutoresizingFlexibleBottomMargin = 1 << 5
} Classname;Java和C的不同之处在于,在C中,枚举本质上是ints。考虑到上述声明,完全合法地写出,
Classname windowOptions = UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleRightMargin;这会将windowOptions设置为1 | 4 == 5,外部系统将能够使用&操作符选择选项。
在Java中,您不能这样做。相反,您可以使用EnumSet<Classname>
EnumSet<Classname> windowOptions =
EnumSet.of(Classname.UIViewAutoresizingFlexibleLeftMargin,
Classname.UIViewAutoresizingFlexibleRightMargin);窗口系统将使用Set.contains来确定设置了哪些选项。要做在C世界中做的事情,必须有人写下:
int bitMask = 0;
for(Classname option: windowOptions) {
bitMask |= option.getValue();
}坦率地说,这是一团糟。
https://stackoverflow.com/questions/16181126
复制相似问题