Java中位运算符的使用
先预知识:
数据在计算机中是以二进制的形式进行存储的,而二进制在内存中是以补码的形式进行存储的。在介绍位运算之前,首先来看一下原码、反码和补码的概念。由于正数的原码、反码和补码的形式都是一样的,所以以下主要针对负数进行讲解。
原码:在数值前直接加一符号位的表示法。
反码:原码的数值位取反(0变1,1变0)。
补码:原码加1。
PS:已知补码,求原码。
分析:按照求负数补码的逆过程,可以采取补码减1再取反的思路。但是对于二进制来说,减1取反和取反加1的效果是一样的。所以仍然可以采用取反加1的方法来求得原码。
Java中的位运算符有:&(按位与)、|(按位或)、^(按位异或)、~(取反)、<<(左移)、>>(右移)、>>>(无符号右移).以int型数据为例介绍,占4个字节,32位:(以下1代表true,0代表false)
&(按位与):当两边操作数全为true时返回true,否则返回false
如,6&3=2,看步骤:
6 00000000 00000000 00000000 00000110
3 00000000 00000000 00000000 00000011
& -------------------------------------------------------
2 00000000 00000000 00000000 00000010
-6&3=2,看步骤:
-6 11111111 11111111 11111111 11111010(补码,原码取反再加1)
3 00000000 00000000 00000000 00000011
& ---------------------------------------------------------
2 00000000 00000000 00000000 00000010
|(按位或):两边操作数只要有一边为true,结果就为true,只有当两边操作数全为false时才返回false
如,6|3=7,看步骤:
6 00000000 00000000 00000000 00000110
3 00000000 00000000 00000000 00000011
| ---------------------------------------------------------
7 00000000 00000000 00000000 00000111
-6|3=-5,看步骤:
-6 11111111 11111111 11111111 11111010(补码,原码取反再加1)
3 00000000 00000000 00000000 00000011
| ----------------------------------------------------------
-5 10000000 00000000 00000000 00000101(原码,补码取反再加1)
^(按位异或):两边操作数相同就为false,不同则为true
如,6^3=5,看步骤:
6 00000000 00000000 00000000 00000110
3 00000000 00000000 00000000 00000011
^ ---------------------------------------------------------
5 00000000 00000000 00000000 00000101
-6^3=-7,看步骤:
-6 11111111 11111111 11111111 11111010(补码,原码取反再加1)
3 00000000 00000000 00000000 00000011
^ ---------------------------------------------------------
-7 10000000 00000000 00000000 00000111(原码,补码取反再加1)
~(取反):二进制每一位取反,1变0,0变1
如:~6=-7,看步骤:
6 00000000 00000000 00000000 00000110
~ --------------------------------------------------------
-7 10000000 00000000 00000000 00000111(原码,补码取反再加1)
~(-6)=5,看步骤:
-6 11111111 11111111 11111111 11111010(补码,原码取反再加1)
~ --------------------------------------------------------
5 00000000 00000000 00000000 00000101
<<(左移):所有位向左移动一位,相当于乘以2,低位用0补齐
如:6<<1=12,看步骤:
6 00000000 00000000 00000000 00000110
<< -----------------------------------------------------------
12 000000000 00000000 00000000 00001100
如:-6<<1=-12,看步骤:
-6 11111111 11111111 11111111 11111010(补码,原码取反再加1)
<< ----------------------------------------------------------
-12 100000000 00000000 00000000 00001100(原码,补码取反再加1)
>>(右移):所有位向右移动一位,相当于除以2,高位按符号位补齐
如:6>>1=3,看步骤:
6 00000000 00000000 00000000 00000110
>> ---------------------------------------------------------
3 00000000 00000000 00000000 000000110
-6>>1=-3,看步骤:
-6 11111111 11111111 11111111 11111010(补码,原码取反再加1)
>> ---------------------------------------------------------
-3 10000000 00000000 00000000 000000110
>>>(无符号右移):所有位向右移动一位,相当于除以2,高位用0补齐
如:6>>1=3,看步骤:
6 00000000 00000000 00000000 00000110
>>> ---------------------------------------------------------
3 00000000 00000000 00000000 000000110
-6>>>1=2147483645,看步骤:
-6 11111111 11111111 11111111 11111010(补码,原码取反再加1)
>>> -----------------------------------------------------------------
2147483645 01111111 11111111 11111111 111111010
Java中位运算符的使用的更多相关文章
- Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)
位运算符主要针对二进制,它包括了:“与”.“非”.“或”.“异或”.从表面上看似乎有点像逻辑运算符,但逻辑运算符是针对两个关系运算符来进行逻辑运算,而位运算符主要针对两个二进制数的位进行逻辑运算.下面 ...
- Java的位运算符实例——与(&)、非(~)、或(|)、异或(^)
一.Java的位运算符实例——与(&).非(~).或(|).异或(^) 1.与(&) 0 & 2 = 0 0 0 0 0 1 0 0 1 0 2.非(~) ~0 = 7 0 0 ...
- Java基础-位运算符Bitwise Operators
Java基础-位运算符Bitwise Operators 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.位运算特点 位运算符分为按位与(&),按位或(|),按位异或(^ ...
- 【JAVA零基础入门系列】Day5 Java中的运算符
运算符,顾名思义就是用于运算的符号,比如最简单的+-*/,这些运算符可以用来进行数学运算,举个最简单的栗子: 已知长方形的长为3cm,高为4cm,求长方形的面积. 好,我们先新建一个项目,命名为Rec ...
- Java 中的运算符和流程控制
Java 中的运算符和流程控制 + 面试题 算术运算符 Java 中的算术运算符,包括以下几种: **算术运算符** **名称** **举例** + 加法 1+2=3 - 减法 2-1=1 \* 乘法 ...
- Java中移位操作运算符的理解
java中的移位运算符有三种: 1. <<: 左移 2. >>: 右移 3. >>>: 无符号右移 使用方法:左移就是将左边的操作数在内存中的二进制数据左移指 ...
- JAVA_SE基础——11.Java中的运算符
在程序设计中,运算符应用得十分广泛,通过运算符可以将两个变量进行任意运算.数学中的"+"."-"."*"."/"运算符同 ...
- java中位运算
1byte(字节)=8bit(比特) 1 0 0 0 0 0 0 0 1 2进制的1的原码 反码 补码 0 0 0 0 0 0 0 0 2进制的0的原码 反码 补码 -1 1 0 0 0 0 ...
- Java 中位移运算符 >>,>>>,<<
Java 中的三种位移运算符 java中有三种移位运算符 << : 左移运算符,num << 1,相当于num乘以2 >> : ...
随机推荐
- 【Linux】添加DNS
1.添加DNS输入命令: vi /etc/resolv.conf 添加一行:nameserver 10.41.132.9 2.查看DNS nslookup 127.0.0.1 | grep Serve ...
- LeetCode(99):恢复二叉搜索树
Hard! 题目描述: 二叉搜索树中的两个节点被错误地交换. 请在不改变其结构的情况下,恢复这棵树. 示例 1: 输入: [1,3,null,null,2] 1 / 3 \ 2 输出 ...
- Linux 系统根目录下各个文件夹的作用
原文: https://blog.csdn.net/qq_26941173/article/details/78376760 /bin 系统由很多放置可执行文件的目录,但是bin目录比较特殊.因为bi ...
- 安装lrzsz 实现windows与linux之间文件互传
环境:CentOS7.4 执行命令安装: [root@linuxhg01 www]# yum install lrzsz rz // Windows 上传到 linux [root@linuxhg01 ...
- laravel 路由模型绑定
我们在使用路由的时候一个很常见的使用场景就是根据资源 ID 查询资源信息: Route::get('task/{id}', function ($id) { $task = \App\Models\T ...
- C++ 使用system()实现锁定屏幕
除了使用函数“LockWorkStation()”实现锁定屏幕,参考:http://www.cnblogs.com/Satu/p/8183081.html 此外,也可以使用函数“system()”来实 ...
- add web server(nginx)
#!/bin/bash # # Web Server Install Script # Last Updated 2012.09.24 # ##### modify by WanJie 2012.09 ...
- tempalte模板
tempalte模板层: 功能:为了更有逻辑的将数据库中的数据渲染到模板中: 模拟数据源: DB = [ {"hostname":"c1.com"," ...
- Hadoop java.lang.ClassNotFoundException: org.apache.commons.lang3.StringUtils
.jar 学习好友推荐案例的时候,提交运行时报错找不到StringUtils java.lang.ClassNotFoundException: org.apache.commons.lang3.St ...
- VSCode Vue文件格式化
参考文档:https://vuejs.github.io/vetur/formatting.html 自从将VSCode更新之后,vue文件的html格式化就失效了,而且vue文件中的js ,css格 ...