C#運算符之與,或,異或及移位運算小結(jié)

本文是對C#中的與,或,異或及移位運算進行了詳細的介紹榄攀,需要的朋友可以過來參考下,希望對大家有所幫助临谱。
1.剖析異或運算(^)

二元 ^ 運算符是為整型和 bool 類型預定義的宅静。對于整型,^ 將計算操作數(shù)的按位“異或”兜辞。對于 bool 操作數(shù)迎瞧,^ 將計算操作數(shù)的邏輯“異或”;也就是說弦疮,當且僅當只有一個操作數(shù)為 true 時夹攒,結(jié)果才為 true。

數(shù)值運算舉例

按位異或的3個特點:
(1) 00=0,01=1 0異或任何數(shù)=任何數(shù)
(2) 10=1,11=0 1異或任何數(shù)-任何數(shù)取反
(3) 11=0,00=0 任何數(shù)異或自己=把自己置0

例如:10100001^00010001=10110000

按位異或的幾個常見用途:
(1) 使某些特定的位翻轉(zhuǎn)
例如對數(shù)10100001的第2位和第3位翻轉(zhuǎn)胁塞,則可以將該數(shù)與00000110進行按位異或運算。
  0100001^00000110 = 10100111

(2) 實現(xiàn)兩個值的交換压语,而不必使用臨時變量啸罢。
例如交換兩個整數(shù)a=10100001,b=00000110的值胎食,可通過下列語句實現(xiàn):
    a = a^b扰才;   //a=10100111
    b = b^a;   //b=10100001
    a = a^b厕怜;   //a=00000110

(3) 在匯編語言中經(jīng)常用于將變量置零:
xor a衩匣,a

(4) 快速判斷兩個值是否相等
舉例1: 判斷兩個整數(shù)a,b是否相等粥航,則可通過下列語句實現(xiàn):
return ((a ^ b) == 0)

舉例2: Linux中最初的ipv6_addr_equal()函數(shù)的實現(xiàn)如下:

static inline int ipv6_addr_equal(const struct in6_addr *a1, const struct in6_addr *a2)
{
    return (a1->s6_addr32[0] == a2->s6_addr32[0] &&
        a1->s6_addr32[1] == a2->s6_addr32[1] &&
        a1->s6_addr32[2] == a2->s6_addr32[2] &&
        a1->s6_addr32[3] == a2->s6_addr32[3]);
}

可以利用按位異或?qū)崿F(xiàn)快速比較, 最新的實現(xiàn)已經(jīng)修改為:
static inline int ipv6_addr_equal(const struct in6_addr *a1, const struct in6_addr *a2)
{
return (((a1->s6_addr32[0] ^ a2->s6_addr32[0]) |
(a1->s6_addr32[1] ^ a2->s6_addr32[1]) |
(a1->s6_addr32[2] ^ a2->s6_addr32[2]) |
(a1->s6_addr32[3] ^ a2->s6_addr32[3])) == 0);
}

2 & 運算符(與)
1 & 0 為0
0 & 0 為0
1 & 1 為1

3 | 運算符(或)

1 & 0 為1
0 & 0 為0
1 & 1 為1


C#移位運算(左移和右移)

C#是用<<(左移) 和 >>(右移) 運算符是用來執(zhí)行移位運算琅捏。

左移 (<<)

將第一個操作數(shù)向左移動第二個操作數(shù)指定的位數(shù),空出的位置補0递雀。
左移相當于乘. 左移一位相當于乘2;左移兩位相當于乘4;左移三位相當于乘8柄延。

x<<1= x2
x<<2= x
4
x<<3= x8
x<<4= x
16

同理, 右移即相反:

右移 (>>)
將第一個操作數(shù)向右移動第二個操作數(shù)所指定的位數(shù),空出的位置補0缀程。

右移相當于整除. 右移一位相當于除以2;右移兩位相當于除以4;右移三位相當于除以8搜吧。

x>>1= x/2
x>>2= x/4
x>>3= x/8
x>>4=x/16


int i = 7;
int j = 2;
Console.WriteLine(i >> j); //輸出結(jié)果為1

當聲明重載C#移位運算符時,第一個操作數(shù)的類型必須總是包含運算符聲明的類或結(jié)構(gòu)杨凑,并且第二個操作數(shù)的類型必須總是 int,如:
class Program
{
static void Main(string[] args)
{
ShiftClass shift1 = new ShiftClass(5, 10);
ShiftClass shift2 = shift1 << 2;
ShiftClass shift3 = shift1 >> 2;
Console.WriteLine("{0} << 2 結(jié)果是:{1}", shift1.valA, shift2.valA);
Console.WriteLine("{0} << 2 結(jié)果是:{1}", shift1.valB,shift2.valB);
Console.WriteLine("{0} >> 2 結(jié)果是:{1}", shift1.valA, shift3.valA);
Console.WriteLine("{0} >> 2 結(jié)果是:{1}", shift1.valB, shift3.valB);
Console.ReadLine();
}
public class ShiftClass
{
public int valA;
public int valB;
public ShiftClass(int valA, int valB)
{
this.valA = valA;
this.valB = valB;
}
public static ShiftClass operator <<(ShiftClass shift, int count)
{
int a = shift.valA << count;
int b = shift.valB << count;
return new ShiftClass(a, b);
}
public static ShiftClass operator >>(ShiftClass shift, int count)
{
int a = shift.valA >> count;
int b = shift.valB >> count;
return new ShiftClass(a, b);
}
}
}

因為位移比乘除速度快.對效率要求高,而且滿足2的冪次方的乘除運方,可以采用位移的方式進行滤奈。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市撩满,隨后出現(xiàn)的幾起案子蜒程,更是在濱河造成了極大的恐慌,老刑警劉巖鹦牛,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搞糕,死亡現(xiàn)場離奇詭異,居然都是意外死亡曼追,警方通過查閱死者的電腦和手機窍仰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來礼殊,“玉大人驹吮,你說我怎么就攤上這事针史。” “怎么了碟狞?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵啄枕,是天一觀的道長。 經(jīng)常有香客問我族沃,道長频祝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任脆淹,我火速辦了婚禮常空,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盖溺。我一直安慰自己漓糙,他們只是感情好,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布烘嘱。 她就那樣靜靜地躺著昆禽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蝇庭。 梳的紋絲不亂的頭發(fā)上醉鳖,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天,我揣著相機與錄音遗契,去河邊找鬼辐棒。 笑死,一個胖子當著我的面吹牛牍蜂,可吹牛的內(nèi)容都是我干的漾根。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鲫竞,長吁一口氣:“原來是場噩夢啊……” “哼辐怕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起从绘,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤寄疏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后僵井,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陕截,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年批什,在試婚紗的時候發(fā)現(xiàn)自己被綠了农曲。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖乳规,靈堂內(nèi)的尸體忽然破棺而出形葬,到底是詐尸還是另有隱情,我是刑警寧澤暮的,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布笙以,位于F島的核電站,受9級特大地震影響冻辩,放射性物質(zhì)發(fā)生泄漏猖腕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一微猖、第九天 我趴在偏房一處隱蔽的房頂上張望谈息。 院中可真熱鬧,春花似錦凛剥、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至互亮,卻和暖如春犁享,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背豹休。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工炊昆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人威根。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓凤巨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親洛搀。 傳聞我的和親對象是個殘疾皇子敢茁,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354

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