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 >> : ...
随机推荐
- Confluence 6 在数据源连接中启用校验查询
确定 Confluence 在数据库连接池中校验数据库连接: 停止 Confluence. 编辑 <installation-directory>/conf/server.xml 文件(或 ...
- Git- 命令及使用
关于Git相关介绍这里就不介绍了,可转<Git- 简介>或者查看官网信息.这篇整理一下git相关的命令. 1) 远程仓库相关命令 克隆下载仓库:$ git clone git://gi ...
- 《剑指offer》 二进制中1的个数
本题来自<剑指offer> 二进制中1的个数 题目: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路: 两种思路: 第一种:对n进行左移,检测最后一位是否为1,但考 ...
- django----Form实时更新两种方式
在ModelForm需要知道: from app03 import models from django.forms import ModelForm class UserForm(ModelForm ...
- MySQL 存储过程与事物
一:存储过程 存储过程可以说是一个记录集吧,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能 存储过程的好处: 1.由于数据库执行动作时,是先编 ...
- docker运行php网站程序
有一个之前的php网站程序需要迁移到K8S,简单调研了下. 基础镜像 官方提供了诸如php:7.1-apache的基础镜像,但是确认必要的扩展,例如gd,当然官方提供了docker-php-ext-i ...
- WPF中矢量图制作和引用
WPF程序有时需要适配不同大小的屏幕,图片是像素图的话,拉伸之后会变模糊,影响美观度,因此可以考虑使用矢量图.网上找到了相应的介绍:http://learnwpf.com/post/2006/06/0 ...
- sendfile
Sendfile 函数在两个文件描写叙述符之间直接传递数据(全然在内核中操作,传送),从而避免了内核缓冲区数据和用户缓冲区数据之间的拷贝,操作效率非常高,被称之为零拷贝. Sendfile 函数的定义 ...
- Bootstrap 框架、插件
Bootstrap,前端工程师比较常用的框架.插件,根据它的定义,我们不妨这样理解,Bootstrap就是用于前端开发的一个模板,就是别人做好了我们直接可以搬过来直接使用或者根据自己需要略加修改设计自 ...
- AtCoder Regular Contest 102 (ARC102) D All Your Paths are Different Lengths 构造
原文链接https://www.cnblogs.com/zhouzhendong/p/ARC102D.html 题目传送门 - ARC102D 题意 给定 $L$,请你构造一个节点个数为 $n$ ,边 ...