<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    yxhxj2006

    常用鏈接

    統(tǒng)計

    最新評論

    深入理解按位異或運算符

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

    5  應(yīng)用通式:

    對兩個表達式執(zhí)行按位異或。

    result = expression1 ^ expression2

    參數(shù)
    result

    任何變量。

    expression1

    任何表達式。

    expression2

    任何表達式。

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

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

    只能用于整數(shù)

     


    下面這個程序用到了“按位異或”運算符:

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

      char  a1='十' ,  a2='點' ,  a3='進' ,  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ù),所有的整數(shù)都可以表示成二進制的,實際上計算機只認識二進制的. 
    位運算就是二進制整數(shù)運算啦. 
    兩個數(shù)按位異或意思就是從個位開始,一位一位的比. 
    如果兩個數(shù)相應(yīng)的位上一樣,結(jié)果就是0,不一樣就是1 
    所以111^101=010 
    那加密的過程就是逐個字符跟那個secret字符異或運算. 
    解密的過程就是密文再跟同一個字符異或運算 
    010^101=111 
    至于為什么密文再次異或就變原文了,這個稍微想下就知道了..

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


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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲视频免费在线播放| 亚洲精品动漫在线| 国产成人综合久久精品亚洲| 国产h肉在线视频免费观看| 久久影视国产亚洲| 国产亚洲蜜芽精品久久| 又大又黄又粗又爽的免费视频| 亚洲人成色在线观看| 蜜臀91精品国产免费观看| 亚洲丶国产丶欧美一区二区三区| 成年女人免费视频播放体验区| 午夜一级免费视频| 亚洲爆乳无码专区www| 日韩免费视频观看| 亚洲熟妇无码另类久久久| A片在线免费观看| 亚洲av永久无码精品国产精品| 国产午夜亚洲精品| 国产成人免费全部网站| 九九久久精品国产免费看小说| 曰韩亚洲av人人夜夜澡人人爽| 久久久久免费精品国产| 亚洲一级高清在线中文字幕| 深夜特黄a级毛片免费播放| 国产亚洲精品精品国产亚洲综合| 免费播放在线日本感人片| 久久精品国产亚洲AV大全| 久久久久国色AV免费观看| 国产成A人亚洲精V品无码| eeuss免费影院| 亚洲精品无码不卡| 在线观看免费宅男视频| 亚洲综合无码无在线观看| 免费观看男人吊女人视频| 亚洲午夜国产精品无卡| 国产裸模视频免费区无码| a毛片在线免费观看| 亚洲国产精品综合久久网络| 久久青草免费91线频观看站街| 91丁香亚洲综合社区| 九九精品免费视频|