同或異或的運算?
運算法則:相同為1,不同為0
運算符號:⊙
表達式:a⊙b=ab+a'b'(a'為非a,b'為非b);
異或運算
運算法則:相同為0,不同為1
運算符號:⊕
表達式 :a⊕b=a'b+ab'(a'為非a,b'為非b)
異或運算的常見用途:
(1) 使某些特定的位翻轉
例如對數10100001的第2位和第3位翻轉,則可以將該數與00000110進行按位異或運算。
10100001^00000110 = 10100111
(2) 實現兩個值的交換,而不必使用臨時變量。
例如交換兩個整數a=10100001,b=00000110的值,可通過下列語句實現:
a = a^b; //a=10100111
b = b^a; //b=10100001
a = a^b; //a=00000110
位移運算
左移運算
運算符:<<
表達式:m<
運算規則:左移n位的時候,最左邊的n位將被丟棄,同時在最右邊補上n個0
eg:00001010 << 2 = 00101000
右移運算
運算符:>>
表達式:m>>n(表示把m右移n位)
運算規則:右移n位的時候,最右邊的n位將被丟棄。 這里要特別注意,如果數 字是一個無符號數值,則用0填補最左邊的n位。如果數字是一個有符號數值,則用數字的符號位填補最左邊的n位。也就是說如果數字原先是一個正數,則右移之后再最左邊補n個0;如果數字原先是負數,則右移之后在最左邊補n個1
eg: 00001010 >> 2 = 00000010
eg: 10001010 >> 3 = 11110001
補充:二進制中把最左面的一位表示符號位,0表示正數,1表示負數
按位與運算
運算符:&
表達式: 00000101 & 00001100 = 00001000
按位或運算
運算符:
表達式:00000101 | 00001100 = 00001110
按位與按位或用途:
typedef NS_ENUM(NSInteger, TestType){ //定義枚舉
TestTypeNone = 0,
TestTypeFirst = 1<<0,
TestTypeSecond = 1<<1,
TestTypeThird = 1<<2,
TestTypeFourth = 1<<3
};
//測試代碼
TestType type = TestTypeFirst | TestTypeFourth;
if (type & TestTypeFirst) {
NSLog(@"TestTypeFirst");
}
if (type & TestTypeSecond) {
NSLog(@"TestTypeSecond");
}
if (type & TestTypeThird) {
NSLog(@"TestTypeThird");
}
if (type & TestTypeFourth) {
NSLog(@"TestTypeFourth");
}
if ((TestTypeFirst | TestTypeThird) & (TestTypeSecond | TestTypeFourth)) {
NSLog(@"(TestTypeFirst | TestTypeThird) & (TestTypeSecond | TestTypeFourth)");
}
if ((TestTypeFirst | TestTypeThird) & (TestTypeSecond | TestTypeThird | TestTypeFourth)) {
NSLog(@"(TestTypeFirst | TestTypeThird) & (TestTypeSecond | TestTypeThird | TestTypeFourth)");
}
//輸出結果
TestTypeFirst
TestTypeFourth
(TestTypeFirst | TestTypeThird) & (TestTypeSecond | TestTypeThird | TestTypeFourth