java负数右移_java取反 -右移-左移-无符号右移的探讨

取反:

在二进制中第一位,1表示符数,0表示正数

byte a = -1;

原码:10000001

反码:11111110

补码:11111111

//异或: 00000000

byte b = -2;

原码:10000010

反码:11111101

补码:11111110

//异或: 00000001

byte c = 3;

// 10000101

System.out.println(~a);

System.out.println(~b);

System.out.println(~c);

运算结果:

0

1

-4

右移:正数右移.负数右移 ,无符号右移

右移的符号是:>>

无符号右移的符号的:>>>

在左右位移时应注意,位移是否超过了数据的长度,如果超过了就会进行取摸运算等:下面的代码中有测试到

//右移:

//右移一个正数,右移一个整数每次在左边补0

int a = 5;

System.out.println(a>>1);

//原码;0000000101

//右移一位: 0000000010

System.out.println(a>>2);

//原码;0000000101

//右移两位: 0000000001

System.out.println(a>>3);

//原码;0000000101

//右移三位: 0000000000

System.out.println(a>>31);

//原码; 0000000101

//右移32位: 0000000000

System.out.println(a>>32);

//int 为32位,当位移等于32时,相当于没有移动,会进行取摸运算

System.out.println(a>>34);

//位移大于32时,进行取摸运算 34%32 = 2

//此时相当于位移两位

System.out.println(a>>>1);

//无符号右移最高位补0

// 原码: 0000000101

//无符号右移 : 0000000010 2

运算结果:

2

1

0

0

5

1

2

负数右移:

//右移一个负数,右移一个整数每次在左边补1

//位移负数,应先将其装换成补码形式,再位移

int a = -5;

//原码:100000101

//反码:111111010 反码是和原码的数相反 第一位相同(符号位)

//补码:111111011 补码在反码后面加1

System.out.println(a>>1);

//补码:111111011

//补码右移一位: 111111101 -3

System.out.println(a>>2);

//补码:111111011

//补码右移两位: 111111110 -2

System.out.println(a>>3);

//补码:111111011

//补码右移三位: 111111111 -1

System.out.println(a>>4);

//补码:111111011

//补码右移四位: 111111111 -1

System.out.println(a>>31);

//补码:111111011

//补码右移31位: 111111111 -1

System.out.println(a>>32);

//int为32 位的数,在位移时,等于没有移动 -5

System.out.println(a>>34);

//int 为32位的,位移34会进行取摸运算 34%32 =2 -2

System.out.println(a>>>1);

//无符号负数的右移在最高位补1;

//补码:111111011

//无符号右移1位:011111101 此时负数将变成一个正数

-3

-2

-1

-1

-1

-5

-2

2147483645

左移:

左移的符号:<<

左移无符号的正负数的符号:<<<

左移的右边补0

//左移正数

int a = 5;

//补码:00000101

System.out.println(a<<1);

//00001010 10

System.out.println(a<<2);

//00010100 20

System.out.println(a<<31);

//为一个负数,左移应注意

运算结果:

10

20

-2147483648

左移负数:

左移都是右边补0

int a = -5;

//补码:11111011

System.out.println(a<<1);

//左移一位:11110110 -10

System.out.println(a<<2);

//左移两位:11101100 -20

System.out.println(a<<31);

//左移31会出现问题

System.out.println(a<<34);

//相当于左移两位

//左移两位:11101100 -20

运算结果:

-10

-20

-2147483648

-20

使用位移来求二进制的问题:

public static void main(String[] args) {

//通过右移将十进制的数转换成二进制

int a = 100;

for(int i =31;i>0;i--){

System.out.print(a>>i&1);

}

}

运算结果:

0000000000000000000000000110010

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值