移位运算符和位运算符本质上操纵二进制位。 因为计算机中存储了二进制数据,所以运算效率相对较高。
移位运算符:将整数的二进制位向左或向右移位。 向左移动一个位相当于这个数乘以2,向右移动一个位,等于这个数除以2
/*移位运算符
将整数的二进制位向左或向右移位
将职位左移,在右侧添加0,
将位向右移动,向左编码位(最高位) )。
无符号按位向右移动,向左移动0*/
classdemo 07 { publicstaticvoidmain (字符串[ ] args ) {int xx=20;
system.out.println(xx1; //40
/*x内存中的二进制格式为:
0000 0000 0000 0000 0000 0000 0001 0100
x1向左移动一位
0000000000000000000000000000000000101000 */system.out.println (xx1 ); //10
/*x内存中的二进制格式为:
0000 0000 0000 0000 0000 0000 0001 0100
x1向右移动一位,向左补充0
00000000000000000000000000000000000000000001010 */xx=-20;
system.out.println(xx1; //-40
/*x内存中的二进制格式为:
1111 1111 1111 1111 1111 1111 1110 1100
x1向左移动一位
111111111111111111111111111111111011011000 */system.out.println (xx1 ); //-10
/*x内存中的二进制格式为:
1111 1111 1111 1111 1111 1111 1110 1100
x1向右移动一个,向左添加一个
111111111111111111111111111111111111111110110 * /
//向左移动一位相当于这个数乘以2,向右移动一位相当于这个数除以2的数
xx=-11;
system.out.println(xx1; //-22
/*x内存中的二进制格式为:
1111 1111 1111 1111 1111 1111 1111 0101
x1向左移动一位
111111111111111111111111111111111111111101010 */xx=-13;
system.out.println(xx1; //-26
/*x内存中的二进制格式为:
1111 1111 1111 1111 1111 1111 1111 0011
x1向左移动一个,向右侧添加0
1111111111111111111111111111111111111111100110 */xx=-11;
system.out.println(xx1; //-6
/*x内存中的二进制格式为:
1111 1111 1111 1111 1111 1111 1111 0101
x1向右移动一个,向左添加一个
111111111111111111111111111111111111110101 */xx=-13;
system.out.println(xx1; //-7
/*x内存中的二进制格式为:
1111 1111 1111 1111 1111 1111 1111 0011
x1向右移动一个,向左添加一个
111111111111111111111111111111111111110011 */xx=-11;
system.out.println(xx1; //2147483642
/*x内存中的二进制格式为:
1111 1111 1111 1111 1111 1111 1111 0101
x1无符号移位1位
0111111111111111111111111111111111111110101 * /
//用一个整数乘以/除以2的幂时,移位运算效率最高
}
}
位运算符:
按位或|按位异或^
/*
位运算符
按位、按位或|、按位异或^、按位反转
如果操作员的左右两侧为布尔值,则为逻辑积;
左右为整数,为位和
*/
类demo 08 {
publicstaticvoidmain (字符串[ ] 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(xy; //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
}
}