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 0 0 1
计算机中真正参与运算的是 补码!
在java中所有的数字都是有符号的! 符号就是 正 0 负 1
最高位(最左边的)的 0和1 就是 符号位
什么是最高位? 就是最左边的数字!
java中最小的单位是 byte(字节)
生活中我们买了一个50G的内存条! 插入到我们的电脑中 有50G吗??
没有! 因为所有的厂商都是以 1G=1000MB 来计算的!
但是我们的电脑 是以 1G=1024MB 来计算的!所以 不足50G!
原码:第一位是符号位
反码:符号位不动,原码去反
补码:正数的补码和原码相同
负数的补码:符号位不动,反码+1
1+2
0 0 0 0 0 0 0 1
+0 0 0 0 0 0 1 0
--------------------
0 0 0 0 0 0 1 1 ==》 1*2的0次方+1*2的1次方 ===》3
符号位 就是 最高位(最左边的)
0 正数
1 负数
-1
1 0 0 0 0 0 0 1
-2
1 0 0 0 0 0 1 0
1 - 2
01.找到-2的原码
1 0 0 0 0 0 1 0 02.需要把原码转换成反码
1 1 1 1 1 1 0 1 03.反码需要转换成补码
1 1 1 1 1 1 1 0 04.得到-2 运算的 补码
+ 0 0 0 0 0 0 0 1
---------------------------
1 1 1 1 1 1 1 1 得到的是结果的补码 需要转换成反码 再转换成原码
1 1 1 1 1 1 1 0 得到了结果的反码
1 0 0 0 0 0 0 1 得到了结果的源码 -1
4 - 3
1 0 0 0 0 0 1 1 01.找到-3的原码 把原码转换成反码
1 1 1 1 1 1 0 0 02.反码需要转换成补码
1 1 1 1 1 1 0 1 03.得到补码 可以运算
+0 0 0 0 0 1 0 0
---------------------------------------------
0 0 0 0 0 0 0 1 结果是正数 1
注意点
01. 计算机中运算的都是补码
02. 正数和0的反码补码原码都是一致的
03. 在java中所有的数字都是有符号
04. 负数的反码=符号位不变+其他位取反(0=1 1=0)
05. 负数的补码=反码+1
算术右移 : 符号位不变,低位溢出删除! 高位补零!
int newCapacity = oldCapacity + (oldCapacity >> 1);
int newCapacity=10+(10 >> 1);
10 >> 1
10: 指的是需要位移的数字
>>:位移方向
1 :位移的位数
01.首先找到10的2进制
0 0 0 0 1 0 1 0
0 0 0 0 1 0 1 0 02.右移一位
-------------------------
0 0 0 0 0 1 0 1 1*2的0次方+1*2的2次方=5
算术左移 : 符号位不变,高位溢出删除! 低位补零!
10 << 1
01.首先找到10的2进制
0 0 0 0 1 0 1 0
0 0 0 0 1 0 1 0 02.左移一位
------------------------------------
0 0 0 1 0 1 0 0 1*2的2次方+1*2的4次方=20
逻辑右移: 不管符号位! 低位溢出删除! 高位补零! 没有逻辑左移!!!
10 >>> 2
0 0 0 0 1 0 1 0
0 0 0 0 1 0 1 0
---------------------------
0 0 0 0 0 0 1 0 1*2的1次方=2
-1
1 0 0 0 0 0 0 1 01.原码
1 1 1 1 1 1 1 0 02.反码
1 1 1 1 1 1 1 1 03.补码
1 1 1 1 1 1 1 1 04.右移一位 高位补零
-----------------------------------
0 1 1 1 1 1 1 1
===》 结果2147483647
位运算:
01.按位与 & : 两位都为1,结果为1
3 & 4
0 0 0 0 0 0 1 1
& 0 0 0 0 0 1 0 0
-------------------------
0 0 0 0 0 0 0 0
2 & 3
0 0 0 0 0 0 1 1
& 0 0 0 0 0 0 1 0
---------------------
0 0 0 0 0 0 1 0
02.按位与 |:两位有一个为1,结果为1
3 | 4
0 0 0 0 0 0 1 1
| 0 0 0 0 0 1 0 0
-------------------------
0 0 0 0 0 1 1 1
2 | 3
0 0 0 0 0 0 1 1
| 0 0 0 0 0 0 1 0
---------------------
0 0 0 0 0 0 1 1
03.按位异或 ^ :两位必须是一个为0 一个为1的时候,结果才是1!
3 ^ 4
0 0 0 0 0 0 1 1
^ 0 0 0 0 0 1 0 0
-------------------------
0 0 0 0 0 1 1 1
2 ^ 3
0 0 0 0 0 0 1 1
^ 0 0 0 0 0 0 1 0
---------------------
0 0 0 0 0 0 0 1
04.按位取反 ~ : 仅限于一个表达式运算
~ 3
~ 0 0 0 0 0 0 1 1
---------------------
1 1 1 1 1 1 0 0 原码
1 0 0 0 0 0 1 1 反码
1 0 0 0 0 1 0 0 补码
----------------------- -4
这是输出是补码操作
int a=-6;
/**
* -6 的原码:1000 0110
* 反码:1111 1001
* 补码:1111 1010
*/
//输出补码的方式
for (int i=0;i<32;i++){
//0x80000000--->二进制:1000 0000 0000 0000 0000 0000 0000 0000
int t=(a&0x80000000>>>i)>>>(31-i);
System.out.print(t);
}
输出结果是:11111111111111111111111111111010
a、算数运算符: + - * / %
b、赋值运算符: = += -= *= /= %= &= |=
c、关系运算符: < > <= >= == !=
d、逻辑运算符:&& || !
e、三目运算符:( ? :)
f、字符串连接:+
g、位运算
& 位都为1,结果才为1,否则结果为0
| 位只要有一个为1,那么结果就是1,否则就为0
^ 两个操作数的位中,相同则结果为0,不同则结果为1
~ 如果位为0,结果是1,如果位为1,结果是0
h、移位:
<< 左移运算符,将运算符左边的对象向左移动运算符右边指定的位数(在低位补0)
>> "有符号"右移运算符,将运算符左边的对象向右移动运算符右边指定的位数。使用
符号扩展机制,也就是说,如果值为正,则在高位补0,如果值为负,则
在高位补1.
>>> "无符号"右移运算符,将运算符左边的对象向右移动运算符右边指定的位数。采
用0扩展机制,也就是说,无论值的正负,都在高位补0.
(PS:x<<y 相当于 x*2y ;x>>y相当于x/2y,从计算速度上讲,移位运算要比算术运算快。如果x是负数,
那么x>>>3没有什么算术意义,只有逻辑意义。)
运算符优先级:从左到右
[ ] ( ) ++ -- ! ~ instanceof * / %
+ - << >> >>> < > < = > = ==
!= & ^ && || ? : op=
| 位运算: | |
| 2&3 3|4 | |
| 2<<2 | |
| 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 0 0 1 | |
| 计算机中真正参与运算的是 补码! | |
| 在java中所有的数字都是有符号的! 符号就是 正 0 负 1 | |
| 最高位(最左边的)的 0和1 就是 符号位 | |
| 什么是最高位? 就是最左边的数字! | |
| java中最小的单位是 byte(字节) | |
| 生活中我们买了一个50G的内存条! 插入到我们的电脑中 有50G吗?? | |
| 没有! 因为所有的厂商都是以 1G=1000MB 来计算的! | |
| 但是我们的电脑 是以 1G=1024MB 来计算的!所以 不足50G! | |
| 01. 原码 | |
| 02. 反码 | |
| 03. 补码 | |
| 68 | |
| 6*10的1次方+8*10的0次方 | |
| 1byte = 8 bit | |
| 1 10进制 | |
| 0 0 0 0 0 0 0 1 二进制 | |
| 1*2的0次方 | |
| 1+2 | |
| 0 0 0 0 0 0 0 1 | |
| + 0 0 0 0 0 0 1 0 | |
| -------------------- | |
| 0 0 0 0 0 0 1 1 ==》 1*2的0次方+1*2的1次方 ===》3 | |
| 符号位 就是 最高位(最左边的) | |
| 0 正数 | |
| 1 负数 | |
| -1 | |
| 1 0 0 0 0 0 0 1 | |
| -2 | |
| 1 0 0 0 0 0 1 0 | |
| 1 - 2 | |
| 01.找到-2的原码 | |
| 1 0 0 0 0 0 1 0 02.需要把原码转换成反码 | |
| 1 1 1 1 1 1 0 1 03.反码需要转换成补码 | |
| 1 1 1 1 1 1 1 0 04.得到-2 运算的 补码 | |
| + 0 0 0 0 0 0 0 1 | |
| --------------------------- | |
| 1 1 1 1 1 1 1 1 得到的是结果的补码 需要转换成反码 再转换成原码 | |
| 1 1 1 1 1 1 1 0 得到了结果的反码 | |
| 1 0 0 0 0 0 0 1 得到了结果的源码 -1 | |
| 4 - 3 | |
| 1 0 0 0 0 0 1 1 01.找到-3的原码 把原码转换成反码 | |
| 1 1 1 1 1 1 0 0 02.反码需要转换成补码 | |
| 1 1 1 1 1 1 0 1 03.得到补码 可以运算 | |
| +0 0 0 0 0 1 0 0 | |
| --------------------------------------------- | |
| 0 0 0 0 0 0 0 1 结果是正数 1 | |
| 注意点 | |
| 01. 计算机中运算的都是补码 | |
| 02. 正数和0的反码补码原码都是一致的 | |
| 03. 在java中所有的数字都是有符号 | |
| 04. 负数的反码=符号位不变+其他位取反(0=1 1=0) | |
| 05. 负数的补码=反码+1 | |
| 算术右移 : 符号位不变,低位溢出删除! 高位补零! | |
| int newCapacity = oldCapacity + (oldCapacity >> 1); | |
| int newCapacity=10+(10 >> 1); | |
| 10 >> 1 | |
| 10: 指的是需要位移的数字 | |
| >>:位移方向 | |
| 1 :位移的位数 | |
| 01.首先找到10的2进制 | |
| 0 0 0 0 1 0 1 0 | |
| 0 0 0 0 1 0 1 0 02.右移一位 | |
| ------------------------- | |
| 0 0 0 0 0 1 0 1 1*2的0次方+1*2的2次方=5 | |
| 算术左移 : 符号位不变,高位溢出删除! 低位补零! | |
| 10 << 1 | |
| 01.首先找到10的2进制 | |
| 0 0 0 0 1 0 1 0 | |
| 0 0 0 0 1 0 1 0 02.左移一位 | |
| ------------------------------------ | |
| 0 0 0 1 0 1 0 0 1*2的2次方+1*2的4次方=20 | |
| 逻辑右移: 不管符号位! 低位溢出删除! 高位补零! 没有逻辑左移!!! | |
| 10 >>> 2 | |
| 0 0 0 0 1 0 1 0 | |
| 0 0 0 0 1 0 1 0 | |
| --------------------------- | |
| 0 0 0 0 0 0 1 0 1*2的1次方=2 | |
| -1 | |
| 1 0 0 0 0 0 0 1 01.原码 | |
| 1 1 1 1 1 1 1 0 02.反码 | |
| 1 1 1 1 1 1 1 1 03.补码 | |
| 1 1 1 1 1 1 1 1 04.右移一位 高位补零 | |
| ----------------------------------- | |
| 0 1 1 1 1 1 1 1 | |
| ===》 结果2147483647 | |
| 位运算: | |
| 01.按位与 & : 两位都为1,结果为1 | |
| 3 & 4 | |
| 0 0 0 0 0 0 1 1 | |
| & 0 0 0 0 0 1 0 0 | |
| ------------------------- | |
| 0 0 0 0 0 0 0 0 | |
| 2 & 3 | |
| 0 0 0 0 0 0 1 1 | |
| & 0 0 0 0 0 0 1 0 | |
| --------------------- | |
| 0 0 0 0 0 0 1 0 | |
| 02.按位与 |:两位有一个为1,结果为1 | |
| 3 | 4 | |
| 0 0 0 0 0 0 1 1 | |
| | 0 0 0 0 0 1 0 0 | |
| ------------------------- | |
| 0 0 0 0 0 1 1 1 | |
| 2 | 3 | |
| 0 0 0 0 0 0 1 1 | |
| | 0 0 0 0 0 0 1 0 | |
| --------------------- | |
| 0 0 0 0 0 0 1 1 | |
| 03.按位异或 ^ :两位必须是一个为0 一个为1的时候,结果才是1! | |
| 3 ^ 4 | |
| 0 0 0 0 0 0 1 1 | |
| ^ 0 0 0 0 0 1 0 0 | |
| ------------------------- | |
| 0 0 0 0 0 1 1 1 | |
| 2 ^ 3 | |
| 0 0 0 0 0 0 1 1 | |
| ^ 0 0 0 0 0 0 1 0 | |
| --------------------- | |
| 0 0 0 0 0 0 0 1 | |
| 04.按位取反 ~ : 仅限于一个表达式运算 | |
| ~ 3 | |
| ~ 0 0 0 0 0 0 1 1 | |
| --------------------- | |
| 1 1 1 1 1 1 0 0 原码 | |
| 1 0 0 0 0 0 1 1 反码 | |
| 1 0 0 0 0 1 0 0 补码 | |
| ----------------------- -4 |
java中位运算的更多相关文章
- java中位运算和移位运算详解
一.位运算 (1)按 位 与 & 如果两个相应的二进制形式的对应的位数都为1,则结果为1,记为同1为1,否则为0.首先我们看一下对正数的运算 分别看一下正数和负数的具体运算步骤 ...
- java中位运算^,&,<<,>>,<<<,>>>总结
1.^(亦或运算) ,针对二进制,相同的为0,不同的为1 public static void main(String[] args) { System.out.println("2^3运算 ...
- js中位运算的运用
原文:js中位运算的运用 我们可能很少在编程中用位运算,如果没深入学习,可能也很难理解.平时的数值运算,其实是要先转换成二进制再进行运算的,而位运算就是直接进行二进制运算,所以位运算的执行效率肯定是更 ...
- Java的位运算 待整理
位运算:二进制运算 Java的异或运算^ 真^假=真 假^真=真 假^假=假 真^真= 假,这四个是在网上copy的例子,真是1,假是0 但它却是说明了Java异或运算的基本法则,那就是:只要两个条件 ...
- java中 & ^ ~ 的运算
java运算符 与(&).非(~).或(|).异或(^) 最近看HashMap源码,遇到了这样一段代码: 1 static final int hash(Object key) { 2 i ...
- Java中位运算符的使用
先预知识: 数据在计算机中是以二进制的形式进行存储的,而二进制在内存中是以补码的形式进行存储的.在介绍位运算之前,首先来看一下原码.反码和补码的概念.由于正数的原码.反码和补码的形式都是一样的,所以以 ...
- java中的运算,+-* /% | ^ &
java中运算都是操作符号,那么整形默认为int,双精度默认为都double 整数 看案例: 无法编译通过:操作默认为int,接受结果为int,所以这个地方编译无法通过,所以需要强制类型转换 再看案例 ...
- LeetCode解题中位运算的运用
位运算是我最近才开始重视的东西,因为在LeetCode上面刷题的时候发现很多题目使用位运算会快很多.位运算的使用包含着许多技巧(详细可以参考http://blog.csdn.net/zmazon/ar ...
- C++中位运算
简介 1 位逻辑运算符: & (位 “与”) and ----------------- 2个都为1 才是1-----------0^0 = 0 , 0^1 = 0, 1^0 = 0 ...
随机推荐
- android.os.NetworkOnMainThreadException异常如何解决
android.os.NetworkOnMainThreadException 08-08 17:53:30.635 I/ArticleTable(22461): 添加成功 58 08-08 17:5 ...
- 关于getchar函数缓冲区的问题
最近,看到有同学问我关于getchar()这个函数缓冲区的问题,结合我以前的学习,我将对getchar()进行一次总结,当然,这些都是别人已经提过的东西,我只是总结,接下来我们来看看. 首先,用get ...
- 单片机PWM调制技术
我们可以看看下图,下图就是一个典型的PWM的波形图. T是一个周期,T1就是高电平所占用的时间,T2就是低电平所占用的时间. 如上图所示T1为脉冲宽度(就是导通时间),周期为T,则输出电压的平均值为U ...
- Linux命令之文件搜索
locate 文件名 locate只能搜索文件名,不能搜索文件大小.搜索速度快. locate并不会搜索到那些新加入的文件.新加入文件后,使用updatedb,更新数据库后,再使用locate搜索. ...
- 在线学习Java免费资源推荐
你想学习Java吗?来对地方了!这篇文章将会介绍很多高质量的免费资源,包括网页.论坛.电子书和速查表. Java是一种面向对象的编程语言,拥有独立.多线程.安全.动态和健壮的特点.归功于其多功能的特点 ...
- MySQL/MariaDB中的事务和事务隔离级别
本文目录:1.事务特性2.事务分类 2.1 扁平事务 2.2 带保存点的扁平事务 2.3 链式事务 2.4 嵌套事务 2.5 分布式事务3.事务控制语句4.显式事务的次数统计5.一致性非锁定读(快照查 ...
- Spring,@Controller,@RequestMapping, @ResponseBody,@RequestParam
1.@Controller,放在类的上方,使类生效; 2.@RequestMapping,,指定一个映射,method为访问方式,headers为含有指定请求头 3. @ResponseBody将返回 ...
- HTML 学习笔记 day one
HTML学习笔记 day one Chapter one 网站开发基础 1.2网站的基本架构 网站的基本要素:内容,页面,超链接 动态网页和静态网页的区别在于:动态网页会自动更新,后缀名是.asp或者 ...
- self,和类实例化加不加括号的理解
# class Dog(object): # def talk(self): # print('汪汪~~~') # print(self) # self就是对象,默认将对象传递到类方法,self不需要 ...
- C/C++静态代码安全检查工具
静态代码安全检查工具是一种能够帮助程序员自动检测出源程序中是否存在安全缺陷的软件.它通过逐行分析程序的源代码,发现软件中潜在的安全漏洞.本文针对 C/C++语言程序设计中容易存在的多种安全问题,分别分 ...