Objective-C中的位運算符用法

Objective-C語言中有各種各樣的運算符可處理數(shù)字中的特定位捻浦,如下表所示:

符號運算

& 按位與
| 按位或
^ 按位異或
~ 一次求反
<< 向左移位
>> 向右移位

表中列出的所有運算符,除一次求反運算符(~)外桥爽,都是二元運算符朱灿,因此需要兩個運算數(shù)。位運算符可處理任何類型的整型值钠四,但不能處理浮點值盗扒。

1、按位運算符

對兩個值執(zhí)行與運算時缀去,會逐位比較兩個值的二進制表示侣灶。第一個值與第二個值對應(yīng)位都為1時,在結(jié)果的對應(yīng)位上就會得到1缕碎,其他的組合在結(jié)果中都得到0褥影。如果b1和b2表示兩個運算數(shù)的對應(yīng)位,那么下表(稱為真值表)就顯示了在b1和b2所有可能值下對b1和b2執(zhí)行與操作的結(jié)果咏雌。

b1 b2 b1 & b2
——————————
0 0 0
0 1 0
1 0 0
1 1 1

例如凡怎,如果w1和w2都定義為short int , w1等于十六進制的15 , w2等于十六進制的0c,那么以下C語句會將值0x04指派給w3赊抖。

w3 = w1 & w2;

將w1栅贴、w2和w3都表示為二進制后可更清楚地看到此過程,假設(shè)所處理的short int大小為16位熏迹。

w1 0000 0000 0001 0101 0x15
w2 0000 0000 0000 1100 & 0x0c
————————————————————
w3 0000 0000 0000 0100 0x04

按位與運算經(jīng)常用于屏蔽運算檐薯。就是說,這個運算符可輕易地將數(shù)據(jù)項的特定位設(shè)置為0。例如坛缕,語句

w3 = w1 & 3;

將w1與常量3按位與所得的值指派給w3墓猎。它的作用是將w3中的全部位(而非最右邊的兩位)設(shè)置為0,并保留w1中最左邊的兩位赚楚。

與Objective-C中使用的所有二元運算符相同毙沾,通過添加等號,二元位運算符可同樣用作賦值運算符宠页。因此語句

word &= 15;

與下列語句

word = word & 15;

執(zhí)行相同的功能左胞。

此外,它還能將word的全部位設(shè)置為0举户,但最右邊的四位除外烤宙。

2、按位或運算符

在Objective-C中對兩個值執(zhí)行按位或運算時俭嘁,會逐位比較兩個值的二進制表示躺枕。此時,只要第一個值或者第二個值的相應(yīng)位是1供填。那么結(jié)果的對應(yīng)位就是1拐云。按位或操作符的真值表如下所示。

b1 b2 b1 | b2
———————————
0 0 0
0 1 1
1 0 1
1 1 1

所以近她,如果w1是short int,等于十六進制的19, w2也是short int叉瘩,等于十六進制的6a,那么對w1和vv2執(zhí)行按位或會得到十六進制的7b粘捎,如下所示:

w1 0000 0000 0001 1001 0x19
w2 0000 0000 0110 1010 | 0x6a
————————————————————
0000 0000 0111 1011 0x7b

按位或操作通常就稱為按位OR房揭,用于將某個詞的特定位設(shè)為1。例如晌端,以下語句將w1最右邊的三位設(shè)為1捅暴,而不管這些位操作前的狀態(tài)是什么都是如此。

w1 = w1 | 07;

當(dāng)然咧纠,可以在語句中使用特殊的斌值運算符蓬痒,如下面的語句所示:

w1 |= 07;

我們在后面會提供一個程序例子,演示如何使用按位或運算符漆羔。

3梧奢、按位異或運算符

按位異或運算符,通常稱為XOR運算符演痒,遵守以下規(guī)則:對干兩個運算數(shù)的相應(yīng)位亲轨,如果任何一個位是1,但不是兩者全為1鸟顺,那么結(jié)果的對應(yīng)位將是1惦蚊,否則是0器虾。該運算符的真值表如

下所示:

b1 b2 b1 ^ b2
————————————
0 0 0
0 1 1
1 0 1
1 1 0

如果w1和w2分別等于十六進制的5e和d6,那么w1與w2執(zhí)行異或運算后的結(jié)果是十六進制值e8蹦锋,如下所示:

w1 0000 0000 0101 1110 0x5e
w2 0000 0000 1011 0110 ^ 0xd6
——————————————————————
0000 0000 1110 1000 0xe8

本文就先講到這里兆沙,對于Objective-C位運算符我們下一篇繼續(xù)探討,下次主要討論一下Objective-C位運算符中的一次求反莉掂、向左移位運算葛圃、向右移位運算,下回見憎妙。

1库正、一次求反運算

一次求反運算符是一元運算符,它的作用僅是對運算數(shù)的位“翻轉(zhuǎn)”厘唾。將運算數(shù)的每個是1的位翻轉(zhuǎn)為0褥符,而將每個是0的位翻轉(zhuǎn)為1。此處提供真值表只是為了保持內(nèi)容的完整性阅嘶。

b1 ~b1
——————
0 1
1 0

如果w1是short int, 16位長,等于十六進制值a52f载迄,那么對該值執(zhí)行一次求反運算會得到十六進制值5ab0:

w1 1010 0101 0010 1111 0xa52f
~w1 0101 1010 1101 0000 0x5ab0

如果不知道運算中數(shù)值的準(zhǔn)確位大小讯柔,那么一次求反運算符非常有用,使用它可讓程序不會依賴于整數(shù)數(shù)據(jù)類型的特定大小护昧。例如魂迄,要將類型為int的w1的最低位設(shè)為0,可將一個所有位都是1惋耙、但最右邊的位是0的int值與w1進行與運算捣炬。所以像下面這樣的C語句在用32位表示整數(shù)的機器上可正常工作。

w1 &= 0xFFFFFFFE;

如果用

w1 &= ~1;

替換上面的語句绽榛,那么在任何機器上w1都會同正確的值進行與運算湿酸。

這是因為這條語句會對1求反,然后在左側(cè)會加入足夠的1灭美,以滿足int的大小要求(在32位機器上推溃,會在左側(cè)的31個位上加入1)。

現(xiàn)在届腐,顯示一個實際的程序例子铁坎,說明各種位運算符的用途

// Bitwise operators illustrated
#import
intmain (intargc,char*argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
unsignedintw1 = 0xA0A0A0A0, w2 = 0xFFFF0000,
w3 = 0x00007777;
NSLog (@”%x %x %x”, w1 & w2, w1 | w2, w1 ^ w2);
NSLog (@”%x %x %x”, ~w1, ~w2, ~w3);
NSLog (@”%x %x %x”, w1 ^ w1, w1 & ~w2, w1 | w2 | w3);
NSLog (@”%x %x”, w1 | w2 & w3, w1 | w2 & ~w3);
NSLog (@”%x %x”, (w1 & ~w2), (w1 | ~w2));
[pool drain];
return0;
}

結(jié)果輸出:

a0a00000 ffffa0a0 5f5fa0a0
5f5f5f5f ffff ffff8888
0 a0a0 fffff7f7
a0a0a0a0 ffffa0a0
ffffa0a0 a0a00000

對代碼中的每個運算都演算一遍,確定你理解了這些結(jié)果是如何得到的犁苏。

在第四個NSLog調(diào)用中硬萍,需要注意重要的一點,即按位與運算符的優(yōu)先級要高于按位或運算符围详,因為這會實際影響表達式的最終結(jié)果值朴乖。

第五個NSLog調(diào)用展示了DeMorgan的規(guī)則:(a & ~b)等于a | b,(a | ~b)等于a & b。

2寒砖、向左移位運算符

對值執(zhí)行向左移位運算時赐劣,按照字面的意思,值中包含的位將向左移動哩都。與該操作關(guān)聯(lián)的是該值要移動的位置(或位)數(shù)目魁兼。超出數(shù)據(jù)項的高位的位將丟失,而從低位移入的值總為0漠嵌。因此咐汞,如果w1等于3,那么表達式

w1 = w1 << 1;

可同樣表示成

w1 <<= 1;

結(jié)果就是3向左移一位儒鹿,這樣產(chǎn)生的6將賦值給w1化撕。

w1 ... 0000 0011 0x03

w1 << 1 ... 0000 0110 0x06

3、向右移位運算符

顧名思義约炎,向右移位運算符(>>)把值的位向右移動植阴。從值的低位移出的位將丟失。把無符號的值向右移位總是左側(cè)(就是高位)移人0圾浅。對于有符號值而言掠手,左側(cè)移入1還是0依賴于被移動數(shù)字的符號,還取決于該操作在計算機上的實現(xiàn)方式狸捕。如果符號位是0(表示該值是正的)喷鸽,不管哪種機器都將移人0。然而灸拍,如果符號位是1做祝,那么在一些計算機上將移人1,而其他計算機上則移入0鸡岗。前一類型的運算符通常稱為算術(shù)右移混槐,而后者通常稱為邏輯右移。

如果w1是unsigned int轩性,用32位表示它并且它等于+六進制的F777EE22纵隔,那么使用語句

w1 >>= 1;

將w1右移一位后,w1等于十六進制的7BBBF711炮姨,如下所示:

w1 1111 0111 0111 0111 1110 1110 0010 0010 0xF777EE22
w1 >> 1 0111 1011 1011 1011 1111 0111 0001 0001 0x7BBBF711

如果將w1聲明為(有符號)的short int捌刮,在某些計算機上會得到相同的結(jié)果;而在其他計算機上舒岸,如果將該運算作為算術(shù)右移來執(zhí)行绅作,結(jié)果將會是FBBBF711。

應(yīng)該注意到蛾派,如果試圖用大于或等于該數(shù)據(jù)項的位數(shù)將值向左或向右移位俄认,那么該Objective-C語言并不會產(chǎn)生規(guī)定的結(jié)果个少。因此,例如計算機用32位表示整數(shù)眯杏,那么把一個整數(shù)向左或向右移動32位或更多位時夜焦,并不會在計算機上產(chǎn)生規(guī)定的結(jié)果。還注意到岂贩,如果使用負數(shù)對值移位時茫经,結(jié)果將同樣是未定義的。

本文轉(zhuǎn)自:http://www.cnblogs.com/pengyingh/articles/2357033.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末萎津,一起剝皮案震驚了整個濱河市卸伞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锉屈,老刑警劉巖荤傲,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異颈渊,居然都是意外死亡遂黍,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門俊嗽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雾家,“玉大人,你說我怎么就攤上這事乌询“裉” “怎么了豌研?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵妹田,是天一觀的道長。 經(jīng)常有香客問我鹃共,道長鬼佣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任霜浴,我火速辦了婚禮晶衷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘阴孟。我一直安慰自己晌纫,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布永丝。 她就那樣靜靜地躺著锹漱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪慕嚷。 梳的紋絲不亂的頭發(fā)上哥牍,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天毕泌,我揣著相機與錄音,去河邊找鬼嗅辣。 笑死撼泛,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的澡谭。 我是一名探鬼主播愿题,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼译暂!你這毒婦竟也來了抠忘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤外永,失蹤者是張志新(化名)和其女友劉穎崎脉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伯顶,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡囚灼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了祭衩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灶体。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掐暮,靈堂內(nèi)的尸體忽然破棺而出蝎抽,到底是詐尸還是另有隱情,我是刑警寧澤路克,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布樟结,位于F島的核電站,受9級特大地震影響精算,放射性物質(zhì)發(fā)生泄漏瓢宦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一灰羽、第九天 我趴在偏房一處隱蔽的房頂上張望驮履。 院中可真熱鬧,春花似錦廉嚼、人聲如沸玫镐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽恐似。三九已至,卻和暖如春舰绘,著一層夾襖步出監(jiān)牢的瞬間蹂喻,已是汗流浹背葱椭。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留口四,地道東北人孵运。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像蔓彩,于是被迫代替她去往敵國和親治笨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容