1、位运算符
一共3个移位运算符,左移位<<
,右移位>>
和无符号移位>>>
。左移位<<
在低位处补0。右移位>>
若值为正则在高位插入0,若值为负则在高位插入1。无符号右移位>>>
无论正负都在高位处插入0。
~
:
非运算符,对各位取反。
&
:
与运算符,对两个整型操作数中对应位执行布尔代数,两个位都为1时输出1,否则0。(这个有问题吧。。。。)
|
:
或运算符,对两个整型操作数中对应位执行布尔代数,两个位都为0时输出0,否则1。
^
:
异或运算符,对两个整型操作数中对应位执行布尔代数,两个位相等0,不等1。
如:
以下哪种运算正确:
A. 1010 0000 0000 0000 0000 0000 0000 0000 >> 4
gives 0000 1010 0000 0000 0000 0000 0000 0000
B. 1010 0000 0000 0000 0000 0000 0000 0000 >> 4
gives 1111 1010 0000 0000 0000 0000 0000 0000
C. 1010 0000 0000 0000 0000 0000 0000 0000 >>> 4
gives 0000 1010 0000 0000 0000 0000 0000 0000
D. 1010 0000 0000 0000 0000 0000 0000 0000 >>> 4
0000 1010 0000 0000 0000 0000 0000 0000
gives 1111 1010 0000 0000 0000 0000 0000 0000
选:B C
分析:
以下哪种运算正确:
A的正确答案应该是如下:
1010 0000 0000 0000 0000 0000 0000 0000 >> 4
1111 1010 0000 0000 0000 0000 0000 0000
B的正确答案应该是如下:
1010 0000 0000 0000 0000 0000 0000 0000 >> 4
1111 1010 0000 0000 0000 0000 0000 0000
C的正确答案应该是如下:
1010 0000 0000 0000 0000 0000 0000 0000 >>> 4
0000 1010 0000 0000 0000 0000 0000 0000
D的正确答案应该是如下:
1010 0000 0000 0000 0000 0000 0000 0000 >>> 4
0000 1010 0000 0000 0000 0000 0000 0000
再来一题,以下哪一运算正确:
A. 0000 0100 0000 0000 0000 0000 0000 0000 << 5
gives 1000 0000 0000 0000 0000 0000 0000 0000
B. 0000 0100 0000 0000 0000 0000 0000 0000 << 5
gives 1111 1100 0000 0000 0000 0000 0000 0000
C. 1100 0000 0000 0000 0000 0000 0000 0000 >> 5
gives 1111 1110 0000 0000 0000 0000 0000 0000
D. 1100 0000 0000 0000 0000 0000 0000 0000 >> 5
gives 0000 0110 0000 0000 0000 0000 0000 0000
选:A C
第三题:
Given:
Public class test (
Public static void main (String args[]) (
System.out.printIn (6 ^ 3);
)
)
What is the output
Ans: 5
分析:
正数的原码、补码相同,故运算过程如下(省略高位0):
0110
0011
------
0101
结果为5。
2、位运算符返回的是数值,不是boolean类型值。
如:
if(5&7>0 && 5|2)
System.out.println("true");
显示:编译出错。
分析:
5|2
的运算结果为数值,而不是boolean类型值,将其去掉,修改成如下,即可编译通过:
if((5&7)>0)
System.out.println("true");
3 对于一个整型数进行移位,其右操作数应该小于32,对于一个长整型数进行移位,其右操作数应该小于64。如果右操作数大于了规定的位数,编译不会报错,而是取右操作数的模来进行移位操作。
如:
class Test {
public static void main(String args[]){
int x= 16384;
System.out.println(x>>33);
}
}
显示:8192
4、注意进行位操作时,会自动转成int型,转换之后,可接受右操作数长度为32。进行位运算时,总是先将短整型和字节型值转换成整型值再进行移位操作的。
如:
class Test{
public static void main(String args[]){
byte x = 127;
byte y = (byte)(x>>9);
System.out.println(y);
}
}
显示:0
如:
char c = 'l';
System.out.println(c>>1);
编译通过,把字符值转成了int值。
5 boolean类型值true对应位值1,false对应位值0,返回仍然是boolean类型。&,|,^,都可以用于布尔值,但是~不能用于布尔值。布尔类型true,false可以比较,但只有==能使用,<,<=...会产生编译错误。除此外,布尔类型不能和其他类型数值比较。如:
class Test{
public static void main(String args[]){
boolean x = true;
boolean y = false;
System.out.println((x&y) + " " + (x&x));
System.out.println((x^y) + " " + (y^y));
System.out.println((x|y) + " " + (y|y));
}
}
显示:
false true
true false
true false
6、位运算要求操作数为整数,操作数不能是字符串也不能是小数。
如:
String s = "Hello";
long l = 99;
double d = 1.11;
int i = 1;
int j = 0;
选项:
a:j = i<
char c = 'l';
System.out.println(c>>1);
编译通过,把字符值转成了int值
Integer i = Integer("1");
System.out.println(i>>1);
编译无法通过。
7、由于位运算是二进制运算,不可与一些八进制数搞混,java中二进制无表示法。
如:
System.out.println(010|4);
显示:12
并且当位运算中遇见负数,必须把它转成补码再进行计算。而不是使用原码。
如:
class Test{
public static void main(String args[]){
try
{
int x = -7;
System.out.println(x/2 + " " + (x >> 1));
}
catch(Exception e)
{
System.out.pritnln("Exception");
}
}
}
a A compiler error
b Exception
c -3 -3
d -3 -4
e -4 -4
f None of the above
选:f
-7>>1:
-7补码:11111111 11111111 11111111 11111001
随后操作得: 11111111 11111111 11111111 11111100
关于-7/2,其中仍与正数除法相同,为-3。
如:
int a = -1;
int b = -1;
a = a >>> 31;
b = b >> 31;
显示:a=1,b=-1
其中b处,高位插入1,是插入31个,是一32个1,这是一个补码,随后转成十进制为-1。
稍复杂的如:
int i = 1;
i <<= 31;
i >>= 31;
i >>= 1;
int j = 1;
j <<= 31;
j >>= 31;
System.out.println("i=" + i);
System.out.println("j=" + j);
显示:i=-1 j=-1
i<<=31 : 1000 0000 0000 0000 0000 0000 0000 0000 //这里已经被当作负数了
i>>=31 : 1111 1111 1111 1111 1111 1111 1111 1111
i>>=1 : 1111 1111 1111 1111 1111 1111 1111 1111
8、对于~操作,可以根据计算机中二进制正负数之间的关系,采取取负减一法,即~i = (-i)-1.
如:
int i = 45678;
int j = ~i;
System.out.println(j);
结果:(-45678)-1 = -45679
如:
class Test
{
public static void main(String args[])
{
int x = 1;
int y = ~x+1;
System.out.println(x+" "+y);
}
}
显示:1 -1
9、运算符优先级和运算顺序:运算顺序从左至右,赋值顺序从右至左。
class Test{
public static void main(String args[]){
int [] refToArray = { 10, 11};
int var = 1;
refToArray[var-1] = var = 2;
System.out.println(refToArray[0] + " " + refToArray[1]);
}
}
如上输出为2和11,首先计算数组下标,随后赋值。
另外,运算符== 的优先级高于赋值运算符=的优先级。
如:
public class Test{
public static void main(String args []){
int i = 10;
int j = 10;
boolean b = false;
if(b=i==j)
System.out.println("True");
else
System.out.println("False");
}
}
结果为:True
位运算符和比较符同级别,自左向右运算即可。
如:
if(5&7>0 && 5|2)
System.out.println("true");
显示:编译出错
其中5&7最先计算,随后计算5&7结果是否大于0
[来源:http://hi.baidu.com/nbility/item/e8f5649f344c66dc1f4271c6]
分类目录
- arch/management (17)
- computer (38)
- java/j2ee (305)
- lnmpa (237)
- mac/iphone/ipad/android (11)
- mysql/oracle/postgresql (126)
- os/software (74)
- other (518)
- python (6)
- redis/memcached/mongo (31)
- sitebuild (143)
随便看看
标签云
程序员 创业 人生箴言 eclipse 快捷键 术语 索引 unix命令 vim wordpress java学习笔记 环境变量 oracle内置函数 index 人生 数据类型 nohup tuxedo mysql学习笔记 MS-DOS命令 servlet spring 职场进阶 职业进阶 服务器选购 服务器选型 apache JPA MongoDB 注解 tomcat 子女教育 jquery maven JVM aix命令 网络营销 java异常 seo 人生规划 关键字 css 网络推广 struts 系统优化 成长 frame iframe bluehost jdbc select 我的信仰 oracle函数 cookie HashMap 站长工具 乱码 ArrayList secureCRT jsp session tail find halt 事务 oracle单记录函数 算法 URL window table javascript操作表单元素 String 字符串处理 健康 http 域名 情感 more google A记录 域名解析 netstat 弹出对话框 弹出窗口 框架集 框架 excel 字符串 javascript函数 showModalDialog nginx number 数组 sql frameset 开源程序 java数组 软件 oracle服务友情链接
收藏链接