为什么在枚举中使用二进制移位

时间:2017-04-01 10:22:08

标签: javascript angular typescript enums

我正在看这段代码:

/**
 * Bitmask of states
 */
export const enum ViewState {
    FirstCheck = 1 << 0,      // result is 1
    ChecksEnabled = 1 << 1,   // result is 2
    Errored = 1 << 2,         // result is 4
    Destroyed = 1 << 3        // result is 8
}

我不明白为什么不简单地指定那里的整数结果或整数0,1,2,3。有没有人有任何想法?

2 个答案:

答案 0 :(得分:5)

因为它更容易阅读(无论如何它对我来说,显然也是作者)。随着这个列表的增长,它更容易(对于人类)添加第16个元素并使用1&lt;&lt; 15然后找出结果值将是什么。所以只是一个偏好的问题

使用shift的原因是您可以将多个状态组合成一个值。示例:值为6将为ErroredChecksEnabled

var combined = ViewState.ChecksEnabled | ViewState.Errored;

var isChecksEnabled = (combined & ViewState.ChecksEnabled) == ViewState.ChecksEnabled;
// or
var isChecksEnabled = !!(combined & ViewState.ChecksEnabled);

答案 1 :(得分:3)

这个枚举模拟了四个标志的概念,每个标志可以是/ true / one或off / false / zero。您可以通过逻辑OR运算所需的值来将枚举设置为值。例如:

z = ViewState.FirstCheck | ViewState.ChecksEnabled

稍后在代码中,您可以通过逻辑1将值与您要检查的值相互独立地检查这些值:

if (z & ViewState.FirstCheck) {
  do_something();
}

if (z & ViewState.ChecksEnabled) {
  do_something_else();
}

确保将枚举值分解为明确的,明确的标志集的最简单方法是将单独的值作为2的幂。