java的位运算解析(&/|/~/^/>>/<</>>>)

简介

说到位运算,自然说的全部都是二进制运算,相信大家都比较熟悉,但我还是要说明(啰嗦)一下,java里int型是4个字节,即32位,用二进制表示java里的1就是000……0001,这些都是有符号的数,也就是最高位代表符号位,也就是32位能表示的最大整数是2的32次方-1.下面举得栗子,我不会自己为难自己,搞十几位数,所有都是二位数,所有只用一个字节,且最高依然代表符号位。

& 与运算符

与运算符就相当于&&,不同的是,这是按位对比,比如8&9,用十进制的眼光去看简直就瞎了,8&9其实做的运算就是00001000&00001001,然后看到当且仅当两个对应的位置都是1,结果才是1,否则结果为0,那么结果就是00001000,也就是8.
那么,这个运算有什么卵用么?答案是当然有啦,比如,我们现在都是用int去做标志位,比如1代表正常,0代表异常,那如果我们用二进制来做的话,不就很爽了么,0001代表正常0010代表异常,0100代表XXX,是不是想想都有点小激动·····

| 或运算符

或运算符就相当于||, 当然也是按位去或的,当且仅当两个对应的位置都是0,结果才是0,否则结果是1,那么8|9就是00001000|00001001,结果就是00001001=9。至于这个有什么用,我就不赘述了,有规则就会有用,就这么简单·····

~运算符

非运算符是又得讲一下的,理解起来很容易的,就是按位取反,比如~8对吧,那就是00001000按位取反结果是11110111.前面说了,这是有符号数,也就是最高位代表符号位,也就是~8的结果是一个负数,那么人类第一反应是-8,但结果却不是,那这里简单解析一下,负数的二进制表示方式跟正数不一样,负数有一个反码和补码的概念,这么理解呢?就说-8吧,用二进制表示-8是:11111000,-10的二进制是:11110110.
首先-8的绝对值8的二进制是00001000, 求其反码就是11110111,补码(+1)是11111000。那么上面~8的结果11110111是多少呢?我们算一下,先-1得到11110110,然后取反:00001001,得到9,那么~8==9?不是的,是结果的绝对值,因为是负数,所以是-9.这个结果大家可以去验证下~~~

^异或运算符

异或运算是:当运算符两边不同的时候结果为1,两边相同的时候结果为0 这就是传说中的同性相杀,异性相吻。举个例子就是:8^6=1000^0110=1110=14

>>位移运算符(<<同理)

位移运算符我们可以简单的理解为乘除法,像左移是除法,向右移是乘法。这个符号位是不移动的,注意下。8>>2大家不要理解为8/2,位移两位就是除以2的2次方也就是8/4.这里注意9>>1的结果是4,即最低位的1会移没了··当然了<<如果结果超过了最大整数能表示的范文,那就·····你懂的。

>>> 这个应该是无符号的位移运算符

这个运算符跟>>差不多,不同点是,它移动后高位补0,。好像>>位移后高位也是补0啊,是的,但符号位不移动,而>>>tm符号位都移动了,就是负数一移就正了·····

&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt; &lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd&quot;&gt; &lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt; &lt;groupId&gt;com.example&lt;/groupId&gt; &lt;artifactId&gt;demo5&lt;/artifactId&gt; &lt;version&gt;0.0.1-SNAPSHOT&lt;/version&gt; &lt;name&gt;demo5&lt;/name&gt; &lt;description&gt;demo5&lt;/description&gt; &lt;properties&gt; &lt;java.version&gt;1.8&lt;/java.version&gt; &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt; &lt;project.reporting.outputEncoding&gt;UTF-8&lt;/project.reporting.outputEncoding&gt; &lt;spring-boot.version&gt;2.6.13&lt;/spring-boot.version&gt; &lt;/properties&gt; &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-web&lt;/artifactId&gt; &lt;version&gt;2.6.13&lt;/version&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.projectlombok&lt;/groupId&gt; &lt;artifactId&gt;lombok&lt;/artifactId&gt; &lt;optional&gt;true&lt;/optional&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-starter-test&lt;/artifactId&gt; &lt;scope&gt;test&lt;/scope&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;com.vaadin.external.google&lt;/groupId&gt; &lt;artifactId&gt;android-json&lt;/artifactId&gt; &lt;version&gt;0.0.20131108.vaadin1&lt;/version&gt; &lt;scope&gt;compile&lt;/scope&gt; &lt;/dependency&gt; &lt;dependency&gt; &lt;groupId&gt;net.minidev&lt;/groupId&gt; &lt;artifactId&gt;json-smart&lt;/artifactId&gt; &lt;/dependency&gt; &lt;/dependencies&gt; &lt;dependencyManagement&gt; &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-dependencies&lt;/artifactId&gt; &lt;version&gt;${spring-boot.version}&lt;/version&gt; &lt;type&gt;pom&lt;/type&gt; &lt;scope&gt;import&lt;/scope&gt; &lt;/dependency&gt; &lt;/dependencies&gt; &lt;/dependencyManagement&gt; &lt;build&gt; &lt;plugins&gt; &lt;plugin&gt; &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt; &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt; &lt;version&gt;3.8.1&lt;/version&gt; &lt;configuration&gt; &lt;source&gt;1.8&lt;/source&gt; &lt;target&gt;1.8&lt;/target&gt; &lt;encoding&gt;UTF-8&lt;/encoding&gt; &lt;/configuration&gt; &lt;/plugin&gt; &lt;plugin&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-maven-plugin&lt;/artifactId&gt; &lt;version&gt;${spring-boot.version}&lt;/version&gt; &lt;configuration&gt; &lt;mainClass&gt;com.example.demo.Demo5Application&lt;/mainClass&gt; &lt;skip&gt;true&lt;/skip&gt; &lt;/configuration&gt; &lt;executions&gt; &lt;execution&gt; &lt;id&gt;repackage&lt;/id&gt; &lt;goals&gt; &lt;goal&gt;repackage&lt;/goal&gt; &lt;/goals&gt; &lt;/execution&gt; &lt;/executions&gt; &lt;/plugin&gt; &lt;/plugins&gt; &lt;/build&gt; &lt;/project&gt; 我的依赖是这些想写一个想写一个完成前端数字上传到后端,后端返回相加值的功能
03-08
&lt;think&gt;好的,我现在需要帮助用户实现一个功能:前端上传数字到后端,后端返回相加的结果。用户已经提供了他们的pom.xml文件,我需要先分析他们的依赖情况,然后设计实现步骤。 首先,看看用户的pom.xml。他们使用的是Spring Boot 2.6.13,已经包含了spring-boot-starter-web,所以基本的Web功能是支持的。另外,有lombok用来简化代码,spring-boot-starter-test用于测试,还有android-json和json-smart这两个JSON库。不过,Spring Boot默认使用Jackson来处理JSON,所以可能需要注意依赖冲突,但用户可能已经处理好了,或者这两个库有其他用途,暂时先不考虑这个问题。 接下来,用户的需求是前后端交互,前端发送数字,后端处理并返回和。所以需要创建一个Controller来接收请求,处理数据,并返回结果。首先,确定请求的数据格式。用户可能希望前端发送一个包含数字的JSON对象,比如{&quot;numbers&quot;: [1,2,3]},后端解析后计算总和,返回{&quot;result&quot;: 6}这样的结构。 然后,创建对应的实体类来接收请求体。使用Lombok的@Data注解可以自动生成getter和setter,简化代码。例如,创建一个NumberRequest类,包含一个List&lt;Double&gt;或List&lt;Integer&gt;类型的字段numbers。 接着,编写Controller类,定义一个POST接口,比如/sum,接收NumberRequest对象,计算总和并返回结果。确保方法正确映射,并且能够处理JSON数据。 测试方面,可以使用Postman或者编写单元测试。由于用户的项目中有spring-boot-starter-test,可以编写一个@SpringBootTest来测试Controller层。 另外,需要注意Spring Boot应用的启动类是否正确,通常位于com.example.demo包下,类名为Demo5Application,与pom.xml中的配置一致。 可能的问题点:依赖冲突,特别是JSON库。Spring Boot默认使用Jackson,如果用户添加了其他JSON库,比如json-smart,可能需要排除冲突,或者确保配置正确。但根据用户的pom.xml,spring-boot-starter-web没有排除Jackson,所以默认应该使用Jackson。而android-json可能被其他依赖引入,但如果没有主动配置,可能不会影响。暂时假设不会出现问题,如果有问题再考虑排除依赖。 另外,前端部分用户可能需要简单的HTML页面,使用JavaScript发送POST请求。虽然用户主要关注后端,但提供一个简单的前端示例会更有帮助。例如,使用fetch API发送JSON数据,并显示结果。 综上,步骤大致如下: 1. 创建请求体实体类NumberRequest。 2. 编写Controller处理POST请求,计算总和。 3. 编写启动类(如果尚未存在)。 4. 测试接口是否正常工作。 5. 提供前端示例代码。 现在需要检查用户提供的pom.xml是否有遗漏的依赖,比如是否缺少必要的库。目前看,spring-boot-starter-web已经包含Web MVC和内嵌Tomcat,Jackson也在其中,所以应该没问题。Lombok已经配置,可以正常使用。json-smart可能被其他组件使用,但暂时不影响主要功能。 最后,确保代码结构正确,包名与pom.xml中的groupId一致,即com.example.demo。这样,当用户运行应用时,Spring Boot能够正确扫描组件并启动。&lt;/think&gt;让我们逐步实现这个前后端数字求和功能。以下是详细的步骤说明: 1. 创建实体类`NumberRequest.java`(用于接收前端传参) ```java package com.example.demo.dto; import lombok.Data; import java.util.List; @Data public class NumberRequest { private List&lt;Double&gt; numbers; } ``` 2. 创建Controller类`SumController.java` ```java package com.example.demo.controller; import com.example.demo.dto.NumberRequest; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController public class SumController { @PostMapping(&quot;/sum&quot;) public String calculateSum(@RequestBody NumberRequest request) { double sum = request.getNumbers().stream() .mapToDouble(Double::doubleValue) .sum(); return String.format(&quot;{\&quot;result\&quot;: %.2f}&quot;, sum); } } ``` 3. 确保启动类存在`Demo5Application.java` ```java package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Demo5Application { public static void main(String[] args) { SpringApplication.run(Demo5Application.class, args); } } ``` 4. 使用Postman测试(示例请求): ```json POST http://localhost:8080/sum Content-Type: application/json { &quot;numbers&quot;: [1.5, 2.3, 3.7] } ``` 预期响应: ```json { &quot;result&quot;: 7.50 } ``` 5. 前端HTML示例(可放在`src/main/resources/static`目录下): ```html &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;title&gt;数字求和&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &lt;input type=&quot;text&quot; id=&quot;numbers&quot; placeholder=&quot;输入数字,用逗号分隔&quot;&gt; &lt;button onclick=&quot;calculate()&quot;&gt;计算求和&lt;/button&gt; &lt;p id=&quot;result&quot;&gt;&lt;/p&gt; &lt;script&gt; function calculate() { const input = document.getElementById(&#39;numbers&#39;).value; const numbers = input.split(&#39;,&#39;).map(Number); fetch(&#39;http://localhost:8080/sum&#39;, { method: &#39;POST&#39;, headers: { &#39;Content-Type&#39;: &#39;application/json&#39;, }, body: JSON.stringify({ numbers: numbers }) }) .then(response =&gt; response.json()) .then(data =&gt; { document.getElementById(&#39;result&#39;).textContent = `求和结果:${data.result}`; }) .catch(error =&gt; console.error(&#39;Error:&#39;, error)); } &lt;/script&gt; &lt;/body&gt; &lt;/html&gt; ``` 关键点说明: 1. 依赖验证: - `spring-boot-starter-web`:已包含Web MVC和Tomcat - `lombok`:自动生成getter/setter - `json-smart`:增强JSON处理能力 2. 接口设计: - 使用`@RequestBody`接收JSON参数 - 流式计算求和(支持小数运算) - 返回格式化的JSON字符串 3. 注意事项: - 确保所有数字类型为Double - 处理非数字输入需要额外校验(当前为简化示例) - 跨域问题需要添加`@CrossOrigin`注解(开发环境临时方案) 扩展建议: - 添加输入验证 - 使用ResponseEntity规范返回格式 - 添加异常处理`@ControllerAdvice` - 配置Swagger文档 代码结构应该如下: ``` src/main/java/ └── com/example/demo/ ├── Demo5Application.java ├── controller/ │ └── SumController.java └── dto/ └── NumberRequest.java ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值