深入理解按位异或运算符

参与运算的两个值,如果两个相应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 
至于为什么密文再次异或就变原文了,这个稍微想下就知道了..

时间: 2024-10-29 19:12:00

深入理解按位异或运算符的相关文章

按位异或运算符^

按位异或运算符,通常称为XOR运算符,遵守以下规则:对于两个运算数的相应位,如果任何一个位是1,但不是两者全为1,那么结果的对应位将是1:否则是0.该运算符的真值表:  b1     b2        b1 ^ b2 -------------------------  0       0           0  0       1           1  1       0          1  1       1           0 如果把w1和w2分别等于十六进制的5e和d6,

理解java移位运算符

  移位运算符操作的对象就是二进制的位,可以单独用移位运算符来处理int型整数.  运算符       含义       例子       << 左移运算符,将运算符左边的对象向左移动运算符右边指定的位数(在低位补0) x<<3 >> "有符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数.使用符号扩展机制,也就是说,如果值为正,则在高位补0,如果值为负,则在高位补1. x>>3 >>> "无符

JAVA_学习第二天(五)[ 位异或运算符的特点]

"^" 位逻辑运算符 class ysf {  public static void main(String[] args) {   System.out.println(5 ^ 10 ^ 10);    System.out.println(5 ^ 10 ^ 5);     // "^" 的特点:一个数据对另一个数据位异或两次,该数本身不变  } } 需要定义第三方变量 class ysf {  public static void main(String[] a

位异或运算符的特点

* A:逻辑运算符有哪些 * &, |, ^, ! * &&, || * B:案例演示 * 逻辑运算符的基本用法 * 注意事项: * a:逻辑运算符一般用于连接boolean类型的表达式或者值. * b:表达式:就是用运算符把常量或者变量连接起来的符合java语法的式子. * 算术表达式:a + b * 比较表达式:a == b(条件表达式) * C:结论: * &逻辑与:有false则false. * |逻辑或:有true则true. * ^逻辑异或:相同为false,不

关于【按位与】、【按位或】和【按位异或】

[按位与(&)] eg.10&1410=101014=1110∴10&14=1010=10 eg.-6^5-6的补码:1111 10105=0000 0101-6&5=1 eg.-6&-4-6的补码:1111 1010-4的补码:1111 1100-4&-6=1111 1000=-8 ☆负数的按位与用其补码进行计算 [按位或(|)] 相应位置上都为1或一个为1一个为0,取1:都为零,取0. eg.4|6=6 [按位异或(^)] 特点: (1) 0^0=0,0

1.python基础之常见运算符整理

一.基本的数学运算符 +加,两个对象相加,用来计算最基本的加法,比如1+1,等于2.(同时,加法还可以用来拼接字符串) 2. -减,可以让两个数相减,活着定义负数.2-1等于1. 3.*乘,可以让两个数字相乘,5*5等于25,*乘法也可以用在字符串上,可以使一个字符或者字符串重复若干次. 4./除,两个数相除,做除法运算. 5.%取模运算,就是取余数. 6.**用来算几是几的几次方,比如10的20次方 10 ** 20 最后得出的结果是100000000000000000000. 7.//整除,

python变量赋值与运算符

目录:   1.变量赋值 [=]   2.输入输出[input raw_input,print]   3.常量   4.常用数据类型 [整数,浮点数,布尔值,空值]   5.字符串格式化 [%s,%d,%f,%x]   8.编码 [ASCII,unicode,UTF-8]   9.注释 [#,''']   10.python算术运算符 [+,-,*,/,//,%,**]   11.python比较运算符 [==,!=,<>,>,<,>=,<=]   12.python赋

运算符和表达式(类型转换)

和其他程序设计语言一样,C语言中表示运算的符号称为运算符.运算符是告诉编译程序执行特定算术或逻辑操作的符号,运算的对象称为操作数. 对一个操作数进行运算的运算符称为单目运算符,对两个操作数进行运算的运算符称为双目运算符,三目运算符对三个操作数进行运算.用运算符和括号可以将操作数连接起来组成表达式. C语言提供了40多个运算符,其中一部分跟其他高级语言相同(例如"+"."?"."*"等运算符),另外的与汇编语言类似,对计算机的底层硬件(如指定的物理

指针和指针运算符一起时的运算规则(比如*p++和*++p的区别)

接下来,通过示例彻底理解自增运算符的两种用法(自减的用法与之类似,只不过是加1变成了减1). 1.++i和i++的区别 如清单1(注意代码中的注释): [cpp] view plaincopy #include <stdio.h> int main(void) { int a, b, i = 7; i++; //等价于i = i + 1; ++i; //等价于i = i + 1; a = i++; //等价于a = i; i = i + 1; b = ++i; //等价于i = i + 1;