Java中有3个移位运算符
左移: <<
带符号右移:>>
无符号右移:>>>
数 x x<<2 x>>2 x>>>2
17 00010001 01000100 00000100 00000100
-17 11101111 10111100 11111011 00111011
看一下程序0x表示16进制。ffffffff表示-1
public
class test {
public
static
void main(String[] args) {
int i=0xffffffff;
int c=i<<2;
System.out.println(i);
System.out.println(c);
}
}
输出是-1和-4.这表示
public
class test {
public
static
void main(String[] args) {
int i=0xffffffff;
int c=i<<2;
System.out.println(Integer.toHexString(i));
System.out.println(Integer.toHexString(c));
}
}
使用Integer.toHexString()将10进制转换位16进制。
输出位ffffffff 和fffffffc左移2位最后补2个0,最后的1100转换位16进制就是c
public
class test {
public
static
void main(String[] args) {
int i=0xffffffff;
int c=i>>>2;
System.out.println(Integer.toHexString(i));
System.out.println(Integer.toHexString(c));
}
}
无符号右移输出是ffffffff和3fffffff 右移2位后最左段是0011,转换位16进制就是3
练习:
将一个整数110从右端开始的4到7位变为0.
答:要想将4到7位变为0,先构造一个4到7位是0的数,然后用110和这个数与&。任何数和0与都是0,就完成了任务。要构造一个4到7位是0的数,先构造一个低4位是1的数15,然后将它左移3位,然后取反,就构造成4到7位是0的数了。程序如下。
public
class test {
public
static
void main(String[] args) {
int i=15;
int j=i<<3;
int c=~j;
int k=110;
int
l=k&c;
System.out.println(Integer.toBinaryString(i));
System.out.println(Integer.toBinaryString(j));
System.out.println(Integer.toBinaryString(c));
System.out.println(Integer.toBinaryString(k));
System.out.println(Integer.toBinaryString(l));
}
}
输出是
00001111
01111000
10000111
01101110
00000110
将一个数左移一位等于是将数*2,右移一位相当于将数/2。
左移2位相当与乘两次2,右移2位相当与除两次2.