首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算枚举值

计算枚举值
EN

Stack Overflow用户
提问于 2013-04-24 07:59:00
回答 3查看 437关注 0票数 1

我看过一段关于enum的Java代码

代码语言:javascript
复制
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次方。

通常情况下,如果是

代码语言:javascript
复制
i << j 

表示(i << j)是什么意思?I和J如何影响结果?有人能给我指个教程吗?

EN

回答 3

Stack Overflow用户

发布于 2013-04-24 08:00:24

在Java语言中,<<操作符是left bit-shift operator。例如,i为1,位为00000001。位向左移位(j)为5:00100000,即32。将位向左移位是将整数值乘以2的幂的快速方法。

此外,我应该提到这里使用的数据类型int是32位,而不是8位(为简单起见,我在上面显示了最低的8位)。如果您不小心,也可能会将位“移出”末尾并丢失它们。

票数 3
EN

Stack Overflow用户

发布于 2013-04-24 08:04:21

<<是左移位运算符。如果你把一个整数看作一个二进制字符串,它会将字符串向左移位1,并切掉最左边的位(即0b000101变成了0b01010)。就基本算术而言,不包括溢出,这相当于2的乘法。因此,1<<5是0b1000002^5或32。

在表达式i<<j中,i是被操作的基数,其中j是发生的移位数。当i为1时,如您的示例所示,1<<n将创建一个二进制字符串,其中设置了n+1th位,但没有设置其他位。这很有用,因为您可以将这些字符串添加在一起,并检查每个单独的位,以查看该特定选项是否处于打开状态。

票数 0
EN

Stack Overflow用户

发布于 2013-04-24 08:19:13

Java枚举是类。它们可以有实例变量,尽管将它们设置为可写是非常不好的形式。构造函数

代码语言:javascript
复制
private Classname(int v) {
    this.value = v;
}

表示必须使用int值构造Classname实例。声明UIViewAutoresizingNone(0)UIViewAutoresizingNone的值设置为0,可能是为了处理外部代码。

然而,在Java中这是一种有点愚蠢的方式。在C语言中,我们可以写一个类似的枚举:

代码语言:javascript
复制
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。考虑到上述声明,完全合法地写出,

代码语言:javascript
复制
Classname windowOptions = UIViewAutoresizingFlexibleLeftMargin |
                          UIViewAutoresizingFlexibleRightMargin;

这会将windowOptions设置为1 | 4 == 5,外部系统将能够使用&操作符选择选项。

在Java中,您不能这样做。相反,您可以使用EnumSet<Classname>

代码语言:javascript
复制
EnumSet<Classname> windowOptions =
    EnumSet.of(Classname.UIViewAutoresizingFlexibleLeftMargin,
               Classname.UIViewAutoresizingFlexibleRightMargin);

窗口系统将使用Set.contains来确定设置了哪些选项。要做在C世界中做的事情,必须有人写下:

代码语言:javascript
复制
int bitMask = 0;
for(Classname option: windowOptions) {
    bitMask |= option.getValue();
}

坦率地说,这是一团糟。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16181126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档