引言
最近在针对java的基础进行回顾复习,复习过程中发现对于原码、反码、补码、位运算不太了解,故做笔记如下
原码、反码、补码
这里对其简单进行解释,基本够用
- 二进制的最高位是符号位:0表示正数,1表示负数
- 正数的原码、反码、补码都一样
- 负数的反码 = 它的源码符号位不变,其他位取反(0 ->1 , 1 -> 0)
- 负数的补码 = 它的反码 + 1,负数的反码 = 负数的补码 - 1
- 0的反码、补码都是0
- java中没有无符号数
- 在计算机运算的时候都是以补码的方式来运算的
- 当我们看运算结果的时候,要看他的原码
位运算
七个位运算符(&、|、^、~、>>、<<、>>>)
-
**按位与&:**两位全是1,结果位1,否则为0
-
**按位或|:**两位有一个为1,结果为1,否则为0
-
**按位异或^:**两位一个为0,一个为1,结果为1,否则为0
-
**按位取反~:**0 -> 1,1 -> 0
示例:
在运算时,先将数字转为原码,再转为补码然后使用补码进行运算,将运算后的补码再转为原码即为结果(注意:负数和正数在转换时的方式不一致)
依据补码进行运算,在转换为原码
//2&3=?
1.2的原码:00000000 00000000 00000000 00000010
2的补码:00000000 00000000 00000000 00000010
2.3的原码:00000000 00000000 00000000 00000011
3的补码:00000000 00000000 00000000 00000011
3.按位&
00000000 00000000 00000000 00000010
00000000 00000000 00000000 00000011
运算后的补码:00000000 00000000 00000000 00000010
运算后的原码:00000000 00000000 00000000 00000010
所以结果:2
//~-2=?
1.-2的原码:10000000 00000000 00000000 00000010
2.-2的反码:11111111 11111111 11111111 11111101
3.-2的补码:11111111 11111111 11111111 11111110
4.~-2运算后的补码:00000000 00000000 00000000 00000001
5.运算后的原码:00000000 00000000 00000000 00000001
所以结果:1
//~2=?
1.2的补码:00000000 00000000 00000000 00000010
2.~2运算后的补码:11111111 11111111 11111111 11111101
3.运算后的反码:11111111 11111111 11111111 11111100
4.运算后的原码:10000000 00000000 00000000 00000011
所以结果:-3
-
**算数右移 >>:**低位溢出,符号位不变,并用符号位补溢出的高位
示例:1 >> 2
**本质:**1 / 2 / 2 = 0
-
算数左移 <<:符号位不变,低位补0
**示例:**1 << 2
**本质:**1 * 2 * 2 = 4
-
**逻辑右移 >>>(无符号右移):**低位溢出,高位补0
示例:
//1>>2
1的原码:00000000 00000000 00000000 00000001
1 >> 2:00000000 00000000 00000000 00000000 01
相当于:00000000 00000000 00000000 00000000
本质:1/2/2=0
所以结果:0
//1<<2
1的原码:00000000 00000000 00000000 00000001
1 << 2:00000000 00000000 00000000 00000100
本质:1*2*2=4
所以结果:4