我今天使用枚举和按位运算符进行了一些测试,并使用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");
}
答案 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特有的。