日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java按位异或的运算是,深入理解按位异或运算符

發布時間:2023/12/20 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java按位异或的运算是,深入理解按位异或运算符 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參與運算的兩個值,如果兩個相應bit位相同,則結果為0,否則為1。

即:

0^0 = 0,

1^0 = 1,

0^1 = 1,

1^1 = 0

按位異或的3個特點:

(1) 0^0=0,0^1=1? 0異或任何數=任何數

(2) 1^0=1,1^1=0? 1異或任何數-任何數取反

(3) 任何數異或自己=把自己置0

按位異或的幾個常見用途:

(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

(3) 在匯編語言中經常用于將變量置零:

xor?? a,a

(4) 快速判斷兩個值是否相等

舉例1: 判斷兩個整數a,b是否相等,則可通過下列語句實現:

return ((a ^ b) == 0)

舉例2: Linux中最初的ipv6_addr_equal()函數的實現如下:

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]);

}

可以利用按位異或實現快速比較, 最新的實現已經修改為:

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? 應用通式:

對兩個表達式執行按位異或。

result = expression1 ^ expression2

參數

result

任何變量。

expression1

任何表達式。

expression2

任何表達式。

說明

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

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

只能用于整數

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

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類型,也就是字符類型實際上就是整形,就是數字.

計算機里面所有的信息都是整數,所有的整數都可以表示成二進制的,實際上計算機只認識二進制的.

位運算就是二進制整數運算啦.

兩個數按位異或意思就是從個位開始,一位一位的比.

如果兩個數相應的位上一樣,結果就是0,不一樣就是1

所以111^101=010

那加密的過程就是逐個字符跟那個secret字符異或運算.

解密的過程就是密文再跟同一個字符異或運算

010^101=111

至于為什么密文再次異或就變原文了,這個稍微想下就知道了..

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

總結

以上是生活随笔為你收集整理的java按位异或的运算是,深入理解按位异或运算符的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。