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中位运算的更多相关文章

  1. java中位运算和移位运算详解

    一.位运算 (1)按 位 与 & 如果两个相应的二进制形式的对应的位数都为1,则结果为1,记为同1为1,否则为0.首先我们看一下对正数的运算        分别看一下正数和负数的具体运算步骤 ...

  2. java中位运算^,&,<<,>>,<<<,>>>总结

    1.^(亦或运算) ,针对二进制,相同的为0,不同的为1 public static void main(String[] args) { System.out.println("2^3运算 ...

  3. js中位运算的运用

    原文:js中位运算的运用 我们可能很少在编程中用位运算,如果没深入学习,可能也很难理解.平时的数值运算,其实是要先转换成二进制再进行运算的,而位运算就是直接进行二进制运算,所以位运算的执行效率肯定是更 ...

  4. Java的位运算 待整理

    位运算:二进制运算 Java的异或运算^ 真^假=真 假^真=真 假^假=假 真^真= 假,这四个是在网上copy的例子,真是1,假是0 但它却是说明了Java异或运算的基本法则,那就是:只要两个条件 ...

  5. java中 & ^ ~ 的运算

    java运算符 与(&).非(~).或(|).异或(^)   最近看HashMap源码,遇到了这样一段代码: 1 static final int hash(Object key) { 2 i ...

  6. Java中位运算符的使用

    先预知识: 数据在计算机中是以二进制的形式进行存储的,而二进制在内存中是以补码的形式进行存储的.在介绍位运算之前,首先来看一下原码.反码和补码的概念.由于正数的原码.反码和补码的形式都是一样的,所以以 ...

  7. java中的运算,+-* /% | ^ &

    java中运算都是操作符号,那么整形默认为int,双精度默认为都double 整数 看案例: 无法编译通过:操作默认为int,接受结果为int,所以这个地方编译无法通过,所以需要强制类型转换 再看案例 ...

  8. LeetCode解题中位运算的运用

    位运算是我最近才开始重视的东西,因为在LeetCode上面刷题的时候发现很多题目使用位运算会快很多.位运算的使用包含着许多技巧(详细可以参考http://blog.csdn.net/zmazon/ar ...

  9. C++中位运算

    简介 1 位逻辑运算符: & (位   “与”)  and ----------------- 2个都为1 才是1-----------0^0 = 0 , 0^1 = 0,  1^0 = 0  ...

随机推荐

  1. bash配置文件说明

    login shell: /etc/profile 所有用户全局设定,它首先会调用以下文件:     /etc/inputrc     /etc/profile.d/*.sh     /etc/sys ...

  2. svn中出现各种感叹号说明

    黄色感叹号(有冲突): --这是有冲突了,冲突就是说你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不允许你提交,防止你的提交覆盖了别 ...

  3. Struts2,Spring,Hibernate优缺点

    struts框架具有组件的模块化,灵活性和重用性的优点,同时简化了基于MVC的web应用程序的开发. 优点: Struts跟Tomcat.Turbine等诸多Apache项目一样,是开源软件,这是它的 ...

  4. Android Selector原理

    android的selector对于android开发者而言再熟悉不过了,只要定义一个drawable目录下定义一个selector的xml文件,在布局文件中引用这个xml文件或者在代码中setBac ...

  5. STL容器的基本特性和特征

    1. STL有6种序列容器类型(1)vector它提供对元素的随即访问,在尾部添加和删除元素的时间是固定的,在头部或中部插入和删除元素的复杂度为线性时间.(2)deque在文件中声明.是双端队列,支持 ...

  6. 两个Web应用必须的Servlet Filter

    其实原文是一个英文文章“Two Servlet Filters Every Web Application Should Have” 文章说了2个Filter: GzipFilter ChcheFil ...

  7. Java杂记9—NIO

    前言 非阻塞IO,也被称之为新IO,它重新定义了一些概念. 缓冲buffer 通道 channel 通道选择器 BIO 阻塞IO,几乎所有的java程序员都会的字节流,字符流,输入流,输出流等分类就是 ...

  8. JAVAEE——BOS物流项目13:Quartz概述、创建定时任务、使用JavaMail发送邮件、HighCharts概述、实现区域分区分布图

    1 学习计划 1.Quartz概述 n Quartz介绍和下载 n 入门案例 n Quartz执行流程 n cron表达式 2.在BOS项目中使用Quartz创建定时任务 3.在BOS项目中使用Jav ...

  9. python笔记:#010#运算符

    运算符 目标 算数运算符 比较(关系)运算符 逻辑运算符 赋值运算符 运算符的优先级 数学符号表链接:https://zh.wikipedia.org/wiki/数学符号表 01. 算数运算符 是完成 ...

  10. Centos7下安装MySql

    1.安装MariaDB 安装命令 yum -y install mariadb mariadb-server 安装完成MariaDB,首先启动MariaDB systemctl start maria ...