java 移位运算效率_java 简单认识移位运算符和位运算符

移位运算符和位运算符本质上都是操作二进制位,因为计算机存储的是二进制数据,运算效率相对较高。

移位运算符:把整数的二进制位进行左移或右移 .左移一位,相当于这个数乘以2, 右移一位,相当于这个数除以2

/*移位运算符

把整数的二进制位进行左移或右移

按位左移 << , 右侧补0,

按位右移 >>, 左侧补符号位(最高位)

无符号按位右移>>>, 左侧补0*/

classDemo07 {public static voidmain(String[] args) {int xx = 20;

System.out.println( xx<< 1 ); //40

/*x在内存中的二进制形式为:

0000 0000 0000 0000 0000 0000 0001 0100

xx<<1 左移一位

0 0000 0000 0000 0000 0000 0000 0010 1000*/System.out.println( xx>> 1 ); //10

/*x在内存中的二进制形式为:

0000 0000 0000 0000 0000 0000 0001 0100

xx>>1 右移一位, 左侧补0

0000 0000 0000 0000 0000 0000 0000 1010 0*/xx= -20;

System.out.println( xx<< 1 ); //-40

/*x在内存中的二进制形式为:

1111 1111 1111 1111 1111 1111 1110 1100

xx<<1 左移一位

1 1111 1111 1111 1111 1111 1111 1101 1000*/System.out.println( xx>> 1 ); //-10

/*x在内存中的二进制形式为:

1111 1111 1111 1111 1111 1111 1110 1100

xx>>1 右移一位, 左侧补1

1111 1111 1111 1111 1111 1111 1111 0110*/

//左移一位,相当于这个数乘以2, 右移一位,相当于这个数除以2

xx= -11;

System.out.println( xx<< 1 ); //-22

/*x在内存中的二进制形式为:

1111 1111 1111 1111 1111 1111 1111 0101

xx<<1 左移一位

1 1111 1111 1111 1111 1111 1111 1110 1010*/xx= -13;

System.out.println( xx<< 1 ); //-26

/*x在内存中的二进制形式为:

1111 1111 1111 1111 1111 1111 1111 0011

xx<<1 左移一位, 右侧补0

1 1111 1111 1111 1111 1111 1111 1110 0110*/xx= -11;

System.out.println( xx>> 1 ); //-6

/*x在内存中的二进制形式为:

1111 1111 1111 1111 1111 1111 1111 0101

xx>>1 右移一位, 左侧补1

1111 1111 1111 1111 1111 1111 1111 1010 1*/xx= -13;

System.out.println( xx>> 1 ); //-7

/*x在内存中的二进制形式为:

1111 1111 1111 1111 1111 1111 1111 0011

xx>>1 右移一位, 左侧补1

1111 1111 1111 1111 1111 1111 1111 1001 1*/xx= -11;

System.out.println( xx>>> 1 ); //2147483642

/*x在内存中的二进制形式为:

1111 1111 1111 1111 1111 1111 1111 0101

xx>>>1 无符号移一位

0111 1111 1111 1111 1111 1111 1111 1010 1*/

//一个整数乘以/除以2的幂次方时,通过移位运算效率最高

}

}

位运算符:

按位与 & 按位或 |  按位异或 ^

/*

位运算符

按位与&, 按位或|, 按位异或^, 按位取反

&操作符左右两侧如果是布尔值, &就是逻辑与;

左右两侧为整数,就是按位与

*/

class Demo08 {

public static void main(String[] args) {

int x = 10;

int y = 20;

/*按位与

x在计算机中存储的01序列为:

0000 0000 0000 0000 0000 0000 0000 1010

y的二进制形式为:

0000 0000 0000 0000 0000 0000 0001 0100

按位与&

----------------------------------------------

0000 0000 0000 0000 0000 0000 0000 0000

*/

System.out.println( x&y );//0

/*按位或

x在计算机中存储的01序列为:

0000 0000 0000 0000 0000 0000 0000 1010

y的二进制形式为:

0000 0000 0000 0000 0000 0000 0001 0100

按位或|

----------------------------------------------

0000 0000 0000 0000 0000 0000 0001 1110

*/

System.out.println( x|y );//30

/*按位异或

x在计算机中存储的01序列为:

0000 0000 0000 0000 0000 0000 0000 1010

y的二进制形式为:

0000 0000 0000 0000 0000 0000 0001 0100

按位异或^

----------------------------------------------

0000 0000 0000 0000 0000 0000 0001 1110

*/

System.out.println( x^y );//30

/*按位取反

x在计算机中存储的01序列为:

0000 0000 0000 0000 0000 0000 0000 1010

按位取反

----------------------------------------------

1111 1111 1111 1111 1111 1111 1111 0101

*/

System.out.println( ~x );//-11

// 如何实现两个数的原地交换, 不借助于第三个变量,实现两个变量的交换

x = 10;

y = 20;

//正常情况下,交换两个变量的值

int t = x;

x = y;

y = t;

//方法1:

x = 10;

y = 20;

x = x + y;//x==30

y = x - y;//y==10

x = x - y;//x==20

//方法2:

x = 10;

y = 20;

x = x ^ y;//x==30

y = x ^ y;//y==10

x = x ^ y;//x==20

}

}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值