java位操作_关于java按位操作运算

<1>.在了解位移之前,先了解一下正数和负数的二进制表示形式以及关系:

举例15和-15:

15 的原码: 00000000 00000000 00000000 00001111

补码: 11111111 11111111 11111111 11110000

+1 =

-15的原码:11111111 11111111 11111111 11110001

负数的原码即为:正数的原码取反,再加1。

<2>位移操作:(只针对 int类型的数据有效,java中,一个int的长度始终是32位,也就是4个字节,它操作的都是该整数的二进制数).也可以作用于以下类型,即 byte,short,char,long(当然,它们都是整数形式)。当为这四种类型是,JVM先把它们转换成int型再进行操作。

<

>>     右移

>>>    无符号右移

<< 和>>为数值位移,>>>为逻辑位移。【注】:Java中不存在<<

$1> m<

实例:

3<<2剖析:

3二进制形式: 00000000 00000000 00000000 00000011,按照$1的原理,得到00000000 00000000 00000000 00001100,即为12.

左移使整数变为负数:

10737418<<8

10737418二进制表示形式:00000000 10100011 11010111 00001010,按照$1的原理,得到10100011 11010111 00001010 00000000,即为:-1546188288.

$2> m>>n的含义:把整数m表示的二进制数右移n位,m为正数,高位全部补0;m为负数,高位全部补1. 算术右移 有符号右移

实 例:

3>>2剖析:

3二进制形式: 00000000 00000000 00000000 00000011,按照$2的原理,得到00000000 00000000 00000000 00000000,即为0.

-3>>2剖析:

-3二进制形式: 11111111 11111111 11111111 11111101,按照$2的原理,得到11111111 11111111 11111111 11111111,即为-1.

以上:每 个整数表示的二进制都是32位的,如果右移32位和右移0位的效果是一样的。依次类推,右移32的倍数位都一样。

备注:对于右移32位与右移0位是结果是一样的,我一直不能够理解。现在我只能理解为32比较特殊。相当于整体全移。与移0位相同。左移也是一样的。

$3> m>>>n:整数m表示的二进制右移n位,不论正负数,高位都补零。逻辑右移 无符号右移

实例:

3>>>2剖析:

3二进制形式: 00000000 00000000 00000000 00000011,按照$3的原理,得到00000000 00000000 00000000 00000000,即为0.

-3>>>2剖析:

-3二进制形式: 11111111 11111111 11111111 11111101,按照$3的原理,得到00111111 11111111 11111111 11111111,即为1073741823.

【注】:对于$1,$2,$3,如果n为负数:这时JVM会先让n对32取模,变成一个绝对值小于32的负数,然后再加上32,直到 n 变成一个正数。

实例:

4<

4的二进制形式:00000000 00000000 00000000 00000100,-10对32取模再加上32,不用说了,得到22,则4<

此时按照再按照$1原理,得到00000001 00000000 00000000 00000000,得到的即为:16777216。

4<<34 :相当于 4<<2

OK, 大功告成。

综上所述:

在不大于自身数值类型最大位数的移位时,

m<

m>>n即相当于m除以2的n次方,得到的为整数时,即为结果。如果结果为小数,此时会出现两种情况:(1)如果m为正数,得到的商会无条件 的舍弃小数位;(2)如果m为负数,舍弃小数部分,然后把整数部分加+1得到位移后的值。

接 下来在此说说位操作的好处,速度超快,这些都是底层的二进制机器操作指令。

比如:a*2,

1.jvm先为变量a分配空间;2.再进行a*2的操作;3.再把结果返回给相应的变量。

而 a<<1,和a*2一样,它只需要一条指令即可,速度很快。当然前三种位移操作都是对2的倍数

进行操作时可用。

在hashMap扩容中使用过:左移

int capacity = 1;while (capacity

capacity<<= 1;

ArrayList扩容中使用过:右移

/*** Increases the capacity to ensure that it can hold at least the

* number of elements specified by the minimum capacity argument.

*

*@paramminCapacity the desired minimum capacity*/

private void grow(intminCapacity) {//overflow-conscious code

int oldCapacity =elementData.length;int newCapacity = oldCapacity + (oldCapacity>> 1);if (newCapacity - minCapacity < 0)

newCapacity=minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)

newCapacity=hugeCapacity(minCapacity);//minCapacity is usually close to size, so this is a win:

elementData =Arrays.copyOf(elementData, newCapacity);

}

再 进行些许补充,谈到位操作,当然还要说到四个操作符:

~(按位非),|(按位或),&(按位与),^(按位异或),

这些都是大学 计算机基础用法,对整数的二进制形式进行操作,然后再

转换为整数,具体操作如下。

1.~(按位非):【解义】对该整数的二进制形 式逐位取反。

~4:(一元操作符)

4的二进制形式为:00000000 00000000 00000000 00000100,逐位取反后得

到:11111111 11111111 11111111 11111011,即为-5.

2.| (按位或):【解义】对两个整数的二进制形式逐位进行逻辑或运算,原理为:1|0=1,0|0=0,1|1=1,0|1=1

等。

4|-5:

4的二进制形式为:00000000 00000000 00000000 00000100,

-5的二进制形式为:11111111 11111111 11111111 11111011,

逐位进行逻辑或运算:11111111 11111111 11111111 11111111,即得到-1.

3.&(按位与):【解义】对两个整数的二进制形式逐位进行逻辑与 运算,原理:1|0=0,0|0=0,1&1=1;0&1=0等。

4&-5:

4的二进制形式为:00000000 00000000 00000000 00000100,

-5的二进制形式为:11111111 11111111 11111111 11111011,

逐位进行逻辑与运算:00000000 00000000 00000000 00000000,即得到0.

实际应用:可以把字节转换为整 数,-64&0xFF=192,也可以用八进制的形式,-64&0377=192、

其实0xFF和0377都表示的是整数255、

4.^(按 位异或):【解义】对两个整数的二进制形式逐位进行逻辑异或运算,原理:1^1=0,1^0=1,0^1=1,0^0=0.

4^-5:

4的二进制形式为:00000000 00000000 00000000 00000100,

-5的二进制形式为:11111111 11111111 11111111 11111011,

逐位进行逻辑异或运算:11111111 11111111 11111111 11111111,即得到-1.

实际应用:按位异或可以比较两个数字是否相等,它利用 1^1=0,0^0=0的原理。  20^20==0

转自:http://aokunsang.javaeye.com/blog/615658

关于二进制一些说明:

关于负数的二进制表示方法

今天知道了对于负数的二进制方法的表示方法:例如 -5

第一步:首先要把5变成101的二进制形式

第二步:再者就是按位取反,(形 成前面全是1)010

第三步:在最后加1 形成:11111111 11111111 11111111 11111011

反过来如果把 最高位是1的二进制变成负的整形时

第一步:位取反,变成00000000 00000000 00000000 00000100

第二 步:在最低位加上1,形成101

第三步:形成整形5 ,在加上负号;

在java中怎么用代码实现二进制于十进制的转化

public int binaryInToInt(String str)

{

int j=0,i=0;

char c;

for(i=0;i

{

if(str.charAt(str.length()-i)=='1')

{

j=j+exp(2*ln(str.length()-i));

}

}

return j;

}

转自:

http://blog.csdn.net/zdp5528/archive/2008/04/10/2278719.aspx

(1)正负表示方法

用字节的最高位表示:"1"表示"正","0"表示"负"

(2)计算机中数字是以哪个码储存的?

补码

(3) 负数 的二进制补码转换成十进制的方法

1、把补码“取反”(把二进制数的各位“1”换“0”,“0”换“1”。比如“101010”取反后为“010101”)

2、把取反后的二进制数“加1”

3、最后用常规的方法把“加1”后的二进制数转换为十进制数

将负数转换为二进制

详见:https://www.cnblogs.com/lukelook/p/11274795.html

1.~(按位非):【解义】对该整数的二进制形 式逐位取反。~4:(一元操作符)4的二进制形式为:00000000 00000000 00000000 00000100,逐位取反后得到:11111111 11111111 11111111 11111011,即为-5.2.| (按位或):【解义】对两个整数的二进制形式逐位进行逻辑或运算,原理为:1|0=1,0|0=0,1|1=1,0|1=1等。4|-5:4的二进制形式为:00000000 00000000 00000000 00000100,-5的二进制形式为:11111111 11111111 11111111 11111011,逐位进行逻辑或运算:11111111 11111111 11111111 11111111,即得到-1.3.&(按位与):【解义】对两个整数的二进制形式逐位进行逻辑与 运算,原理:1|0=0,0|0=0,1&1=1;0&1=0等。4&-5:4的二进制形式为:00000000 00000000 00000000 00000100,-5的二进制形式为:11111111 11111111 11111111 11111011,逐位进行逻辑与运算:00000000 00000000 00000000 00000000,即得到0.

实际应用:可以把字节转换为整 数,-64&0xFF=192,也可以用八进制的形式,-64&0377=192、

其实0xFF和0377都表示的是整数255、

4.^(按 位异或):【解义】对两个整数的二进制形式逐位进行逻辑异或运算,原理:1^1=0,1^0=1,0^1=1,0^0=0.

4^-5:

4的二进制形式为:00000000 00000000 00000000 00000100,

-5的二进制形式为:11111111 11111111 11111111 11111011,

逐位进行逻辑异或运算:11111111 11111111 11111111 11111111,即得到-1.

实际应用:按位异或可以比较两个数字是否相等,它利用 1^1=0,0^0=0的原理。  20^20==0

转自:http://aokunsang.javaeye.com/blog/615658

关于二进制一些说明:

关于负数的二进制表示方法

今天知道了对于负数的二进制方法的表示方法:例如 -5第一步:首先要把5变成101的二进制形式第二步:再者就是按位取反,(形 成前面全是1)010第三步:在最后加1 形成:11111111 11111111 11111111 11111011反过来如果把 最高位是1的二进制变成负的整形时第一步:位取反,变成00000000 00000000 00000000 00000100第二 步:在最低位加上1,形成101第三步:形成整形5 ,在加上负号;在java中怎么用代码实现二进制于十进制的转化public int binaryInToInt(String str){int j=0,i=0;char c;for(i=0;i

(1)正负表示方法

用字节的最高位表示:"1"表示"正","0"表示"负"

(2)计算机中数字是以哪个码储存的?

补码

(3) 负数 的二进制补码转换成十进制的方法

1、把补码“取反”(把二进制数的各位“1”换“0”,“0”换“1”。比如“101010”取反后为“010101”)

2、把取反后的二进制数“加1”

3、最后用常规的方法把“加1”后的二进制数转换为十进制数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/441406.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【51Nod - 1117 】聪明的木匠 (贪心,哈夫曼树,时光倒流)

题干&#xff1a; 一位老木匠需要将一根长的木棒切成N段。每段的长度分别为L1,L2,......,LN&#xff08;1 < L1,L2,…,LN < 1000&#xff0c;且均为整数&#xff09;个长度单位。我们认为切割时仅在整数点处切且没有木材损失。 木匠发现&#xff0c;每一次切割花费的体…

java生成16位随机数_java中如何产生一个16位数字组成的随机字符串?谢谢各位了...

展开全部方法如下&#xff1a;Random rannew random();boolean flagtrue;while(flag){int aran.nextInt(99999999);int bran.nextInt(99999999);long ca*100000000Lb;if(c>1000000000000000L&&c<9999999999999999L){flagfalse;c1c;String numString.valueOf(c1);…

java utf-8 gbk_Java 字符转码之UTF-8转为GBK/GB2312

java跟python类似的做法&#xff0c;在java中字符串的编码是java修改过的一种Unicode编码&#xff0c;所以看到java中的字符串&#xff0c;心理要默念这个东西是java修改过的一种Unicode编码的编码。packagestring;importjava.nio.charset.Charset;public classUTF82GBK {publi…

【CodeForces - 760B 】Frodo and pillows (二分题意,注意细节)

题干&#xff1a; n hobbits are planning to spend the night at Frodos house. Frodo has n beds standing in a row and m pillows (n ≤ m). Each hobbit needs a bed and at least one pillow to sleep, however, everyone wants as many pillows as possible. Of cour…

eclipse wsdl2java_使用Eclipse的wsdl2java工具

一、用Eclipse调用Axis的wsdl2java1.在eclipse里面新建一个项目或已有的项目&#xff1b;2.导入activation.jaraxis.jarcommons-discovery.jarcommons-logging-1.0.3.jarjaxrpc.jarsaaj.jarwsdl4j-1.5.2.jar包3右击你的工程&#xff0d;Run As&#xff0d;Run...&#xff0d;右…

【POJ - 2785】4 Values whose Sum is 0 (二分,折半枚举)

题干&#xff1a; The SUM problem can be formulated as follows: given four lists A, B, C, D of integer values, compute how many quadruplet (a, b, c, d ) ∈ A x B x C x D are such that a b c d 0 . In the following, we assume that all lists have the same…

java好的博客_推荐5个万博爆款Java开源博客,是我目前用过最好用的博客系统

1.OneBlog一个简洁美观、功能强大并且自适应的Java博客&#xff0c;使用springboot开发&#xff0c;前端使用Bootstrap&#xff0c;支持移动端自适应&#xff0c;配有完备的前台和后台管理功能。功能简介多种编辑器、自动申请友情链接、百度推送、评论系统、权限管理、SEO、实时…

【UVALive - 3126】Taxi Cab Scheme (二分图,最小路径覆盖)

题目大意&#xff1a; 有n个出车安排&#xff0c;一辆车能接到这个安排的条件是&#xff1a;1、这辆车第一次发车&#xff1b;2、这辆车接了上一个安排&#xff0c;回到这个安排的起点的时间正好是这个安排的前一分钟或者更早 解题报告&#xff1a; 建图然后跑最小路径覆盖。…

java await signal_Java中的await()/signal()用法

二、方法await()/signal()在JDK5.0以后&#xff0c;JAVA提供了新的更加健壮的线程处理机制&#xff0c;包括了同步、锁定、线程池等等&#xff0c;可以实现更小粒度上的控制。await()和signal()就是其中用来同步的两种方法&#xff0c;功能基本上和wait()/notify()相同&#xf…

【HDU - 1083 】Courses (二分图)

题干&#xff1a; Consider a group of N students and P courses. Each student visits zero, one or more than one courses. Your task is to determine whether it is possible to form a committee of exactly P students that satisfies simultaneously the conditions:…

java 主备切换_keepalived 实现 Java 服务的高可用(主备切换)

前言本文要说的是基于 keepalived 实现两台服务器之间的主备切换&#xff0c;从而实现 Java 服务的高可用。keepalived 的原理不多做介绍&#xff0c;自行搜索了解&#xff0c;keepalived 的安装部署请参考 keepalived 的安装及使用 。个人建议不要沉迷于 死扣 和 理解 原理&am…

【HDU - 2444】The Accomodation of Students(二分图判断 + 匈牙利算法求最大匹配)

题干&#xff1a; There are a group of students. Some of them may know each other, while others dont. For example, A and B know each other, B and C know each other. But this may not imply that A and C know each other. Now you are given all pairs of studen…

最长上升子序列 java_最长上升子序列 O(nlogn)解法 (java)

最长递增子序列问题&#xff1a;在一列数中寻找一些数&#xff0c;这些数满足&#xff1a;任意两个数a[i]和a[j]&#xff0c;若i 设dp[i]表示以i为结尾的最长递增子序列的长度&#xff0c;则状态转移方程为&#xff1a; dp[i] max{dp[j]1}, 1<j 这样简单的复杂度为O(n^2)&a…

C++关于引用的注意事项 总结知识点

对函数的引用&#xff1a; #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #def…

中介者模式java_图解Java设计模式之中介者模式

智能家庭项目1)智能家庭包括各种设备&#xff0c;闹钟、咖啡机、电视机、窗帘等2)主人要看电视时&#xff0c;各个设备可以协同工作&#xff0c;自动完成看电视的准备工作&#xff0c;比如流程为 &#xff1a;闹铃响起 - 》咖啡机开始做咖啡 -》窗帘自动落下 -》电视机开始播放…

python 自动驾驶线性识别路段

python视觉库 OpenCV:OpenCV是一个开源的计算机视觉库,提供了丰富的图像处理和计算机视觉算法。它可以用于图像处理、对象识别、特征提取、图像分割等。 Matplotlib:Matplotlib是一个绘图库,可用于创建高质量的二维图表和绘图。它提供了类似于MATLAB的绘图接口,使用户可以…

【CodeForces - 202A】LLPS (思维,字符串)

题干&#xff1a; This problems actual name, "Lexicographically Largest Palindromic Subsequence" is too long to fit into the page headline. You are given string s consisting of lowercase English letters only. Find its lexicographically largest p…

elementui表格宽度适应内容_elementui表格中的列怎么实现自适应列宽

elementui表格中的列怎么实现自适应列宽发布时间&#xff1a;2020-12-28 14:58:04来源&#xff1a;亿速云阅读&#xff1a;53作者&#xff1a;Leah这期内容当中小编将会给大家带来有关elementui表格中的列怎么实现自适应列宽&#xff0c;文章内容丰富且以专业的角度为大家分析和…

【POJ - 2398】Toy Storage (计算几何,二分找位置,叉积,点和直线的位置关系)

题干&#xff1a; Mom and dad have a problem: their child, Reza, never puts his toys away when he is finished playing with them. They gave Reza a rectangular box to put his toys in. Unfortunately, Reza is rebellious and obeys his parents by simply throwing …

【POJ - 1269 】Intersecting Lines (计算几何,直线间的位置关系)

题干&#xff1a; We all know that a pair of distinct points on a plane defines a line and that a pair of lines on a plane will intersect in one of three ways: 1) no intersection because they are parallel, 2) intersect in a line because they are on top of …