Java中的与、或、非以及异或( | ~ ^)运算符的运算原理

article/2025/10/6 7:59:00

首先,我们要知道Java存储数据是保存的补码,如果对原码、反码以及补码不太懂,可以参考我的另一篇博客。

1. Java的 与( & ) 运算

所有的逻辑运算都是按位计算的,所以第一步就是先把数据转成二进制,然后相应位进行 与 运算,具体运算过程可以看下图中的注释。

 

2. Java的 或( | ) 运算

或运算类似,看下图

 

 3. Java的 非( ~ ) 运算

非运算类似,看下图。不知道你有没有看出规律,正数的非运算结果都是本身先加1,然后加个负号;负数的补码也是本身取绝对值,然后减1。可以去验证一下 非 运算这个规律

 

4. Java的 异或 (^) 运算

异或运算是一个比较奇特的运算原理,首先也是按位运算,然后两个数相同结果为0,不同为1,即 1^1 = 0,1^0=1,0^1=1,0^0=0。如果学过数字电路这门课的话,你会知道最基本的三种逻辑运算是 与 或 非,异或是可以用这三种基本逻辑运算表示的,那么怎么表示呢?如果学过数字电路,是可以画卡诺图来用 与 或 非表示异或的,在这里我们就麻烦点、但是通俗易懂地解释一下异或怎么用 与 或 非来表示。

 

aba&ba|b(~a)&ba&(~b)(~a)|ba|(~b)

a^b

000000110
010110101
100101011
111100110

 

如表,a和b之间使用基本运算的组合总共有6种,(~a)&(~b)和a&b的效果是一样,(~a)|(~b)和a|b的效果是一样,而且~(a&b)和(~a)|(~b)是一样的,所以只有上面六种组合。上面6中组合可以怎么组合得到异或结果呢?因为组合有点多,我们通过代码来遍历,代码如下。

class Imple{static void xor(int[][] arr){byte f_and = 0;byte f_or = 0;for (int k = 0; k < 6; k++) {for (int l = k+1; l < 6; l++) {if((arr[k][0] & arr[l][0]) == arr[6][0]){f_and += 1;for (int i = 1; i < 4; i++) {if((arr[k][i] & arr[l][i]) == arr[6][i]){f_and += 1;}}}if((arr[k][0] | arr[l][0]) == arr[6][0]){f_or += 1;for (int i = 1; i < 4; i++) {if((arr[k][i] | arr[l][i]) == arr[6][i]){f_or += 1;}}}if(f_and == 4){System.out.println("异或运算可表达为第" + (k+1) + "个表达式和第" + (l+1) + "个表达式相与");}else if(f_or == 4){System.out.println("异或运算可表达为第" + (k+1) + "个表达式和第" + (l+1) + "个表达式相或");}f_and = 0;f_or = 0;}}}static int[][] initArray(){int[][] com = new int[7][4];int a;int b;for (int j = 0; j < 4; j++) {a = j/2;b = j%2;com[0][j] = a&b;com[1][j] = a|b;com[2][j] = (~a)&b;com[3][j] = a&(~b);com[4][j] = (~a)|b;com[5][j] = a|(~b);com[6][j] = a^b;}return com;}public static void main(String[] args) {int[][] arr;arr = initArray();xor(arr);}
}

运行结果如下图,可知第三个表达式和第四个表达式进行 或 运算可以得到异或的效果,也就是 a^b = ((~a)&b) | (a&(~b))  现在你可以反验证。 

 

上面的表达式其实就是课本中对异或的定义,但是上面的公式似乎还不够简洁 ,两个数异或,还有没有其它表达呢?如下图

所以我们可以进一步表示异或运算为 a^b = |a - b| (相减取绝对值不是十进制,要先转换为二进制,然后对应位相减取绝对值) 

 


http://chatgpt.dhexx.cn/article/0s99vE6t.shtml

相关文章

java运算符 与()、非(~)、或(|)、异或(^)

欢迎大家关注我的公众号【老周聊架构】&#xff0c;Java后端主流技术栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。 位运算符主要针对二进制&#xff0c;它包括了&#xff1a;“与”、“非”、“或”、“异或”。从表面上看似乎有点像逻辑运算符&…

java中的异或非运算

一、java 与或非 操作 与&#xff08;&&#xff09;、非&#xff08;~&#xff09;、或&#xff08;|&#xff09;、异或&#xff08;^&#xff09; 1&#xff0e;与运算符 与运算符用符号“&”表示&#xff0c;其使用规律如下&#xff1a; 两个操作数中位都为1&#x…

java运算符异或(^)的用法

Java中的位运算符中有一个叫做异或的运算符&#xff0c;符号为&#xff08;^&#xff09;,其主要是对两个操作数进行位的异或运算&#xff0c;相同取0&#xff0c;相反取1。即两操作数相同时&#xff0c;互相抵消。 试例&#xff1a;13 与15 两个整数的异或 public static void…

一文搞懂 位运算 异或(Java实现)

提起异或想必很多小伙伴们既熟悉又陌生&#xff0c;熟悉是因为好像在离散数学或者学某个编程语言 时听过这个东西&#xff0c;而陌生呢&#xff0c;则是因为自己平时并没有用过&#xff0c;以至于当在某个场景 &#xff08;我猜是在看 题解或者某篇博客时&#xff09; 看到这…

java中异或运算的应用

java中异或运算(^)的应用 异或运算法则 1. a ^ b b ^ a   2. a ^ b ^ c a ^ (b ^ c) (a ^ b) ^ c;   3. d a ^ b ^ c 可以推出 a d ^ b ^ c.   4. a ^ b ^ a b. 异或运算 1、异或是一个数学运算符。应用于逻辑运算。   2、例如&#xff1a;真异或假的结果是…

java的异或运算

一、题目 输入两个数&#xff0c;交换后输出 二、解题思路 一开始学习的语言是c语言&#xff0c;里面非常有特色的是指针&#xff0c;通过传引用可以直接交换两个数。但java无法达成这种操作&#xff0c;翻阅资料找到了一种有趣的解法&#xff1a;异或! 异或原理&#xff1a; …

java基础-异或运算

小伙伴们&#xff0c;你们好呀&#xff01;我是老寇&#xff01; 异或运算主要用于判断两个值是否一样 异或运算的3个性质&#xff1a; 1.任何数和0进行异或运算&#xff0c;结果是原来的数&#xff0c;即b⊕0b 2.任何数和其自身进行异或运算&#xff0c;结果为0&#xff0c;即…

Java中的异或运算符^

Testpublic void test2() {int a2;int b3;aa^b;ba^b;aa^b;System.out.println("a"a",b"b);}第一种&#xff1a;用真实值计算 ^是异或运算符&#xff0c;异或的规则是转换成二进制比较&#xff0c;相同为0&#xff0c;不同为1. 一个数a与另一个数b异或的结果…

java中的异或运算

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是Rockey&#xff0c;不知名企业的不知名Java开发工程师 &#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&#x1f44d;一下博主哦 &#x1f4dd;联系方式&#xff1a;he18339193956&…

HTTP Status 505 – HTTP Version Not Supported

这个大部分的原因不是httpserver不支持&#xff0c;而是请求url里有空格&#xff0c;检查有空格UTF-8编码再传 比如&#xff1a;远程调用服务端地址有空格 去除空格

HTTP Status 500 解决办法

HTTP Status 500 解决办法 在Java web 论坛系统中也遇见了这个问题&#xff0c;在这里就提供一个解决的办法。 图中显示 int idInteger.parseInt(request.getParameter("id")); 这一段有错误。这里是因为id的值不能为null&#xff0c;不然就会出现这个错误 修改如…

Tomcat HTTP Status 404 tomcat 404问题解决

今天初次使用tomcat的时候&#xff0c;用浏览器访问总是不成功。经过一番周折总算成功了&#xff0c;虽然这个知识点不是很难&#xff0c;但还是写篇博客&#xff0c;希望能帮助那些初学者。(注&#xff1a;笔者用的是&#xff1a;tomcat 7) 前提&#xff1a;你的tomcat可以访…

svn提交报错Unexpected HTTP status 413 'Request Entity Too Large' on

问题原因&#xff1a;nginx的client_max_body_size设置过小&#xff0c;默认 1M&#xff0c;如果请求的正文数据大于client_max_body_size&#xff0c;HTTP协议会报错 413 Request Entity Too Large。 解决方案&#xff1a;把这个值调大就可以了。

HTTP Status 404 - 解决办法

HTTP Status 404 - 解决办法 今天&#xff0c;我在从仓库导入web项目的时候出现了一个问题&#xff1a; 首先&#xff0c;我想的是为什么会出现&#xff0c;这样的问题&#xff0c;然后我对这个问题进行了描述&#xff0c;准备在网上找找解决方法&#xff0c;大多数给出的答案…

HTTP Status 500 – Internal Server Error

第一次碰到500错误,标题很明显,内部服务器错误,解决此类问题重点在于会看错误提示信息,之前一直没有这个意识,看到报错直接百度,其实我们稍微注意一下信息提示就能解决大部分问题,上图: 看下第二条Message,标注了/iframe/head.jsp页面,后边括号表明为第一行第二列(个…

HTTP Status 400的排错步骤 与HTTP Status 404的排错步骤

一、前言&#xff1a;一个问题有暗含两个错误&#xff1a;400和404 二、HTTP Status 400 这是在跳转修改的界面出现&#xff0c;跳不过去说明路径相关有问题 上面 400的解决了&#xff0c;然后运行404又出来了 三、HTTP Status 404 看到资源问题&#xff0c;就去看下导包没有&a…

SpringBoot 设置HTTP 响应状态码 (HTTP Status Code)

SpringBoot 设置HTTP 响应状态码 (HTTP Status Code) HTTP请求响应的内容有很多&#xff0c;包括Body、Cookies、Headers和Status。 我们最常用的是Body、其次Headers、Cookies。而HTTP Status Code关注得最少。 HTTP Status Code 分类分类描述1**信息&#xff0c;服务器收…

HTTP Status 500 - null

出现这类问题&#xff1a;The server encountered an internal error that prevented it from fulfilling this request. java.lang.Integer.parseInt(Integer.java:542) HTTP Status 500 - null 500错误是首先考虑java代码的问题&#xff0c;如果不是java代码的问题的话&#…

Http Status 500

这个错误一般都是空指针异常 错误信息页面一般都提示了错误的页面和行数 我的SearchCondition java:25是这样的 我的name值是空的&#xff0c;然后后面用到了name,所以报了空指针异常&#xff1b; 像大型的项目&#xff0c;可以采取以下的措施&#xff1a; 一、通过System.…

HTTP Status 500 - Internal Server Error

Http请求状态码 200&#xff1a;正常404&#xff1a;资源找不到400&#xff1a;请求类型不匹配500&#xff1a;后台程序抛出异常游览器抛出的异常其实跟最基础的JAVA程序抛出异常是相似的只是异常提醒出现的位置不同&#xff0c;外加给了异常类型的数字&#xff08;200&#xf…