yxhxj2006

          常用鏈接

          統(tǒng)計(jì)

          最新評(píng)論

          深入理解按位異或運(yùn)算符

          參與運(yùn)算的兩個(gè)值,如果兩個(gè)相應(yīng)bit位相同,則結(jié)果為0,否則為1。
          即:
             0^0 = 0, 
                1^0 = 1, 
                0^1 = 1, 
                1^1 = 0
          按位異或的3個(gè)特點(diǎn):
          (1) 0^0=0,0^1=1  0異或任何數(shù)=任何數(shù)
          (2) 1^0=1,1^1=0  1異或任何數(shù)-任何數(shù)取反
          (3) 任何數(shù)異或自己=把自己置0
          按位異或的幾個(gè)常見用途:
          (1) 使某些特定的位翻轉(zhuǎn)
              例如對(duì)數(shù)10100001的第2位和第3位翻轉(zhuǎn),則可以將該數(shù)與00000110進(jìn)行按位異或運(yùn)算。
                 10100001^00000110 = 10100111

          (2) 實(shí)現(xiàn)兩個(gè)值的交換,而不必使用臨時(shí)變量。
              例如交換兩個(gè)整數(shù)a=10100001,b=00000110的值,可通過下列語句實(shí)現(xiàn):
              a = a^b;   //a=10100111
              b = b^a;   //b=10100001
              a = a^b;   //a=00000110

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

          (4) 快速判斷兩個(gè)值是否相等
              舉例1: 判斷兩個(gè)整數(shù)a,b是否相等,則可通過下列語句實(shí)現(xiàn):
                  return ((a ^ b) == 0)
              
              舉例2: Linux中最初的ipv6_addr_equal()函數(shù)的實(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)快速比較, 最新的實(shí)現(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);
              }

          5  應(yīng)用通式:

          對(duì)兩個(gè)表達(dá)式執(zhí)行按位異或。

          result = expression1 ^ expression2

          參數(shù)
          result

          任何變量。

          expression1

          任何表達(dá)式。

          expression2

          任何表達(dá)式。

          說明
          ^ 運(yùn)算符查看兩個(gè)表達(dá)式的二進(jìn)制表示法的值,并執(zhí)行按位異或。該操作的結(jié)果如下所示:

          0101     (expression1)1100     (expression2)----1001     (結(jié)果)當(dāng)且僅當(dāng)只有一個(gè)表達(dá)式的某位上為 1 時(shí),結(jié)果的該位才為 1。否則結(jié)果的該位為 0。

          只能用于整數(shù)

           


          下面這個(gè)程序用到了“按位異或”運(yùn)算符:

          class E 
          { public static void main(String args[ ]) 

            char  a1='十' ,  a2='點(diǎn)' ,  a3='進(jìn)' ,  a4='攻' ; 
            char secret='8' ; 
            a1=(char) (a1^secret); 
            a2=(char) (a2^secret); 
            a3=(char) (a3^secret); 
            a4=(char) (a4^secret); 
            System.out.println("密文:"+a1+a2+a3+a4); 
            a1=(char) (a1^secret); 
            a2=(char) (a2^secret); 
            a3=(char) (a3^secret); 
            a4=(char) (a4^secret); 
            System.out.println("原文:"+a1+a2+a3+a4); 

          }

          就是加密啊解密啊

          char類型,也就是字符類型實(shí)際上就是整形,就是數(shù)字.

          計(jì)算機(jī)里面所有的信息都是整數(shù),所有的整數(shù)都可以表示成二進(jìn)制的,實(shí)際上計(jì)算機(jī)只認(rèn)識(shí)二進(jìn)制的. 
          位運(yùn)算就是二進(jìn)制整數(shù)運(yùn)算啦. 
          兩個(gè)數(shù)按位異或意思就是從個(gè)位開始,一位一位的比. 
          如果兩個(gè)數(shù)相應(yīng)的位上一樣,結(jié)果就是0,不一樣就是1 
          所以111^101=010 
          那加密的過程就是逐個(gè)字符跟那個(gè)secret字符異或運(yùn)算. 
          解密的過程就是密文再跟同一個(gè)字符異或運(yùn)算 
          010^101=111 
          至于為什么密文再次異或就變?cè)牧?這個(gè)稍微想下就知道了..

          posted on 2013-07-18 18:55 奮斗成就男人 閱讀(231) 評(píng)論(0)  編輯  收藏


          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 博爱县| 湄潭县| 奎屯市| 邵武市| 浠水县| 新邵县| 舟山市| 宜君县| 江山市| 惠水县| 锡林郭勒盟| 永顺县| 甘德县| 吕梁市| 杭锦后旗| 革吉县| 镇坪县| 昌都县| 常州市| 临城县| 清水县| 重庆市| 新乡县| 司法| 丰宁| 马公市| 内乡县| 山西省| 兴仁县| 修水县| 二手房| 吉首市| 南木林县| 广丰县| 广西| 兴隆县| 宁城县| 新泰市| 治县。| 龙川县| 天门市|