是否与我期待的相反?

时间:2015-05-13 00:35:52

标签: objective-c enums bitwise-operators

我今天使用枚举和按位运算符进行了一些测试,并使用Xcode验证功能我创建了一系列测试。这是我将继续公开的完整要点。

https://gist.github.com/brennanMKE/ede1f685018e953da8a4

对于枚举,我设置了位移值,以便我可以使用按位运算符来检查值。这是MyState枚举的typedef。

typedef NS_OPTIONS(NSUInteger, MyState) {
    MyStateNone                 = 0,            // (0000 = 0)
    MyStateOn                   = (1 << 0),     // (1000 = 1)
    MyStateOff                  = (1 << 1),     // (0100 = 2)
    MyStateEnabled              = (1 << 2),     // (0010 = 4)
    MyStateDisabled             = (1 << 3),     // (0001 = 8)
    MyStateOnAndEnabled         = MyStateOn | MyStateEnabled,   // 5
    MyStateOffAndDisabled       = MyStateOff | MyStateDisabled  // 10
};

您可以看到开启,关闭,启用和禁用状态是顺序的,这将允许移动值以将状态从“开”和“启用”更改为“关闭”和“禁用”。这些位将从1010变为0101。

我认为这应该是一个正确的转变(&gt;&gt;),但在我的测试中,它是一个左移,它起作用。以下是测试功能。为什么它与我期望的相反的班次操作员合作?也许我的理解与它的作用相反。情况似乎就是这样。

左移似乎在左侧放置0,将所有位向右移动。我认为这意味着左移意味着所有位都向左移动。有人可以澄清吗?感谢。

- (void)testBitShiftingToOnAndEnabled {
    // Note: shifting enum values is ill advised but useful academically

    MyState state = MyStateOffAndDisabled; // 0101 (10)
    NSLog(@"state: %lu", (unsigned long)state);
    // if both values are shifted 1 to the right it becomes off and disabled
    state >>= 1; // 1010 (5)
    NSLog(@"state: %lu", (unsigned long)state);

    XCTAssert(state == MyStateOnAndEnabled, @"Pass");
    XCTAssert(state == 5, @"Pass");
}

- (void)testBitShiftingToOffAndDisabled {
    // Note: shifting enum values is ill adviced but useful academically

    MyState state = MyStateOnAndEnabled; // 1010 (5)
    NSLog(@"state: %lu", (unsigned long)state);
    // if both values are shifted 1 to the left it becomes off and disabled
    state <<= 1; // 0101 (10)
    NSLog(@"state: %lu", (unsigned long)state);

    XCTAssert(state == MyStateOffAndDisabled, @"Pass");
    XCTAssert(state == 10, @"Pass");
}

1 个答案:

答案 0 :(得分:2)

表达式RT_Completed表示将值select RTTech.First_Name as RT_First_Name, RTTech.Last_Name as RT_Last_Name from Technician as RTTech Join RT_Queue_Delta as RT on RT.RT_Completed = RTTech.Tech_ID 的位移到左侧2位。将1<<2视为左箭头。

二进制(8位)中的值1

<<

现在将位移到左侧2位:

1

这就是00000001 将值1更改为4的原因。

您的误解是位排序从右侧开始并向左侧移动。

为您的代码更新了评论:

00000100

BTW - 这是基本的C.没有这是Objective-C特有的。