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

java按位异或的运算是,深入理解按位异或运算符参与运算的两个值,如果两个相应bit位相同,则结果为0,否则为1。即:0^0=0,1^0=1,0^1=1,1^1=0按位异或的3个特点:(1)0^0=0,0^1=10异或任何数=任何数(2)1^0=1,1^1=01异或任何数-任何数取反(3)任何数异或自己=把自己置0按位异或的几个常见用途:(1)使某些特定的位翻转例如对数10100001的第2位和第3位翻转,则…

大家好,又见面了,我是你们的朋友全栈君。

参与运算的两个值,如果两个相应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)  编辑  收藏

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/134934.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 记录使用Depix过程(小白文)

    记录使用Depix过程(小白文)Tips:本文仅用做探索记录(外行+新手),不保证正确性,慎读慎参考!背景:无聊看到一个可以去除马赛克的工具,并有GitHub源码(短短几天10K+star,lsp警告????,我反正不是,没跑过Python代码,一次尝试而已)。过程为本人第一视角,漏掉的部分请自行探索。下载源码,cd到根目录,执行文档(README.d)中的Example代码。到这里,目前还不明白这行代码的意思,不过可以看到两个图片路径,都在示例代码中出现,最后一个看名字就知道,工程根目录输出一个output.png图片。猜测为执

    2022年6月29日
  • ssm框架实现用户登录的拦截器和过滤器[通俗易懂]

    ssm框架实现用户登录的拦截器和过滤器[通俗易懂]文章只要是实现用户登录过程的验证,用拦截器可以拦截用户没有登录的情况下,不能进行访问系统页面以下是自定义拦截器工程目录实现的过程:1:新建一个interceptor拦截器包,创建一个LoginInterceptor拦截器类2:将这个类,继承HandlerInterceptor接口,并实现HandlerInterceptor这个接口的三个方法public…

    2022年7月17日
  • angular面试题及答案_angular面试

    angular面试题及答案_angular面试1.生命周期钩子生命周期的顺序,见下图:ngOnChanges:当组件数据绑定的输入属性发生变化是触发,该方法接收一个SimpleChanges对象,包括当前值和上一个属性值。首次调用一定发生在ngOnInit前,值得注意的是该方法仅限于对象的引用发生变化时才会触发。 ngOninit:初始化指令或组件,在angular第一次显示展示组件的绑定属性后调用,该方法只会调用一次 ng…

    2022年10月17日
  • Python学习路线(课程大纲+Python视频教程+下载地址)

    最新Python学习路线+千锋Python课程大纲+Python视频教程+Python学习资料下载地址大合集目前Python已经成为最受欢迎的程序设计语言之一。Python的设计哲学是“优雅”、“明确”、“简单”。Python的优点(来自百科)简单:Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样。它使你能够专注于解决问题而不是去搞明白…

    2022年4月18日
  • python正则表达式匹配中文(Excel如何根据名字匹配编码)

    字符串的编码乱码问题由来已久,真的是令人头疼。这不是在做正则匹配中文时候,编码又一次成了拦路虎,在这儿记录两点。第一,字符串编码。第二,正则匹配中文。早期编码都用ASCII编码,用一个字节来处理编码。如大写A编码为65,但处理中文时候,一个字节显然不够,至少两哥字节,还不能和ASCII冲突,,中国制定GB2312编码,把中文编进去。类似的,韩国,日本都出来格子标准,结果就是多语言混合的文本中会

    2022年4月15日
  • sql server修改默认端口号(win10系统)

    sql server修改默认端口号(win10系统)引用自:sqlserver、mysql、oracle各自的默认端口号:https://www.cnblogs.com/chenyanlong/p/7753018.htmlsqlserver2012更改默认的端口号为1772:https://blog.csdn.net/sxf359/article/details/75723412文章目录A,修改前测试连接B,开始修改默认端口A,修改前…

    2022年10月21日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号