【Java】位运算符

1.十进制&二进制转换

(1).源码、反码、补码

1.原码表示法规定:用符号位和数值表示带符号数,正数的符号位用“0”表示,负数的符号位用“1”表示,数值部分用二进制形式表示。
2.反码表示法规定:正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。
3.补码表示法规定:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1.
4.正零和负零的补码相同,[+0]补=[-0]补=0000 0000B。

(2).正数、负数存储

在计算机中,正数以源码形式表达,负数以原码的补码形式表达

假设有一个 int 类型的数
值为5在计算机中表示为:(因为java中int 是4个字节,所以高位需要补0,占够32位)00000000 00000000 00000000 00000101
值为-5在计算机中表示为:

  • 原码:一个正数,按照绝对值大小转换成的二进制数;一个负数按照绝对值大小转换成的二进制数,然后最高位补1,称为原码。
    比如 00000000 00000000 00000000 00000101 是 5的 原码;10000000 00000000 00000000 00000101 是 -5的 原码。

  • 反码:正数的反码与原码相同,负数的反码为对该数的原码除符号位外各位取反。
    取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)
    比如:正数00000000 00000000 00000000 00000101 的反码还是 00000000 00000000 00000000 00000101 ;
    负数10000000 00000000 00000000 00000101每一位取反(除符号位),得11111111 11111111 11111111 11111010。
    称:10000000 00000000 00000000 00000101 和 11111111 11111111 11111111 11111010互为反码。

  • 补码:正数的补码与原码相同,负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1.
    比如:10000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。
    那么,补码为:
    11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011

所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。

java中int数据内存表示

1.java中int的取值范围为-2147483648到±2147483648。
2.首先jdk中定义int占4个字节32位,32位就是jvm仅仅给分配32个格子的空间,用以存放数据。
3.计算机中用0和1存放数据。那么,32个格子中放满0或1的方法,有2的32次方种。
4.但是java中int有正负之分,所以32个格子中占用一个格子标识正负,仅仅能用31个格子来标识数值。最后int能标识的最大/最小数字是:2的31次方即+/- 2147483648。取值范围即为二者之间。

2.与、或、非、异或

(1).与(&)

两个操作数中位都为1,结果才为1,否则结果为0

(2).或(|)

两个位只要有一个为1,那么结果就是1,否则就为0

(3).非(~)

如果位为0,结果是1,如果位为1,结果是0

(4).异或(^)

两个操作数的位中,相同则结果为0,不同则结果为1

3.移位运算符

运算符含义
<<左移运算符,将运算符左边的对象向左移动运算符右边指定的位数(在低位补0)
>>"有符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。使用符号扩展机制,也就是说,如果值为正,则在高位补0,如果值为负,则在高位补1.
>>>"无符号"右移运算 符,将运算符左边的对象向右移动运算符右边指定的位数。采用0扩展机制,也就是说,无论值的正负,都在高位补0.

System.out.println(Integer.toBinaryString(6297));
System.out.println(Integer.toBinaryString(-6297));
System.out.println(Integer.toBinaryString(6297>>5));
System.out.println(Integer.toBinaryString(-6297>>5));
System.out.println(Integer.toBinaryString(6297>>>5));
System.out.println(Integer.toBinaryString(-6297>>>5));
System.out.println(Integer.toBinaryString(6297<<5));
System.out.println(Integer.toBinaryString(-6297<<5));

运行结果:
1100010011001
11111111111111111110011101100111
11000100
11111111111111111111111100111011
11000100
111111111111111111100111011
110001001100100000
11111111111111001110110011100000

注:x<<y 相当于 x*2y ;x>>y相当于x/2y
从计算速度上讲,移位运算要比算术运算快。
如果x是负数,那么x>>>3没有什么算术意义,只有逻辑意义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值