说说&和&& |和||的区别 及关于位操作符的使用和总结

来源:互联网 发布:淘宝禁止返现规定 编辑:程序博客网 时间:2024/06/13 10:18

参考资料:

张孝祥老师整理的Java就业面试题大全

Java开发实战经典(李兴华老师)

及http://hi.baidu.com/onjee/blog/item/4e902d1f3450040f304e15ca.html

package src;

/** 本示例演示&和&& |和||联系与区别 by: fasttime 2010-12-12 * */
public class LogicAnd {
public static void main(String[] args) {
/***********************************************************************
* &和&&都可以做为逻辑与的运算符,表示逻辑与(and),当两边的表达式结果都为true时
* 整个结果才为true,否则只有一方为false,则结果为false
* &&还具有短路的功能,如第一个表达式为false,则不会执行第二个表示式
**********************************************************************/

/** 例: */
try {
String str = null;
if (str != null && str.equals("")) {
/**
* 当str为null时,后面的表示式,不会执行.所以不会出现,NullPointerException
* 如将&&改为&,则会抛出空指向异常
*/
System.out.println("test &和&&的区别");

} else {
System.out.println("test &和&&的区别");
}

} catch (Exception e) {
e.printStackTrace();
}
/**
* 注意点: &操作符在if或其它流程控制语句中需要两边都为Boolean表达式.
* 否则只能当位操作符使用.
* &和&&在含有自增或自减的表达式中的区别
*/
int it = 1, yt = 1,iy=1,yu=1;
if (it == 2 & ++yt > 0) {
// 此时y会增长
}
System.out.println("yt的值为(采用&): " + yt);
if (iy == 2 && ++yu > 0) {
//此时y不会增长
}
System.out.println("yu的值为(采用&&): " + yu);

/**关于|和||的区别
* |->or 或
* ||->短路或
* */
boolean b1=true;
boolean b2=false;
int b3=1;
System.out.println("b1||b2: "+(b1||b2));
System.out.println("b1|b2: "+(b1|b2));
/**通过以上代码,我们得知,就算第一表达式为false,采用&操作符的话,也会执行第二表达式*/

/**
* &还可以做为位运算符,当&操作符两边的表达式不是Boolean类型时,&表示按位与操作,
* 我们通常使用0x0f来与一个整数进行&运算,来获取该整数的的最低4个bit位
*/
/**
* Java中有4个位运算符:
* & 按位与(都是1才是1)
* | 按位或(有1就是1)
* ^ 按位异或(相同为0,不同为1)
* ~ 按位取反(0变1,1变0)
*
* */


/**首先介绍下进制问题:
* 二进制(范围0-1)->内部(电脑)、八进制(范围0-7)->键盘编码
* 十进制(范围0-9)->生活中,如:阿拉伯数字
* 十六进制(范围0-9ABCDEF)其中A表10、依此类推->颜色
* 前缀0x表十六进制进制,前缀0代表八进制
* 将十六进制0x31转换为二进制为:
* 采用1位换4位的形式,如: 3-->0011而1-->0001
* 0000 0000 0000 0000 0000 0000 0011 0001-->所对应的16进制为0x31,二进制为:49
* 0000 0000 0000 0000 0000 0000 0000 1111-->所对应的16进制为0x0f,二进制为:15
* 按位与处理两个长度相同的二进制数, 两个相应的二进位都为1,
* 该位的结果值才为1,否则为0(都是1才是1)
* 0000 0000 0000 0000 0000 0000 0000 0001-->所对应的二进制为1
*
* 按位或处理两个长度相同的二进制数, 两个相应的二进位中只要有一个为1,
* 该位的结果值为1.(有1则为1)
* 0000 0000 0000 0000 0000 0000 0011 0001-->所对应的16进制为0x31,二进制为:49
* 0000 0000 0000 0000 0000 0000 0000 1111-->所对应的16进制为0x0f,二进制为:15
* 两个相应的二进位中只要有一个为1, 该位的结果值为1.
* 0000 0000 0000 0000 0000 0000 0011 1111-->所对应的二进制为63
* */
System.out.println(0x31&0x0f);//所对应的二进制为1,请看上面的解释
System.out.println(0x31|0x0f);//所对应的二进制为63,请看上面的解释
/**
* 按位异或运算, 对等长二进制模式或二进制数的每一位执行逻辑异或操作.
* 操作的结果是如果某位不同则该位为1, 否则该位为0(相同为0,不同为1)
* 0000 0000 0000 0000 0000 0000 0011 0001-->所对应的16进制为0x31,二进制为:49
* 0000 0000 0000 0000 0000 0000 0000 1111-->所对应的16进制为0x0f,二进制为:15
* 0000 0000 0000 0000 0000 0000 0011 1110-->所对应的二进制为62
* */
System.out.println(0x31^0x0f);
/**
* 取反是一元运算符, 对一个二进制数的每一位执行逻辑反操作. 使数字1成为0, 0成为1.
* 0000 0000 0000 0000 0000 0000 0000 1111-->所对应的16进制为0x0f,二进制为:15
* 1111 1111 1111 1111 1111 1111 1111 0000-->所对应的二进制为-16
* 注:将最高位作为符号位(1为负,0为正),其余各位代表数值本身的绝对值(二进制表示)
* */
System.out.println(~0x0f);
/**关于java中直接对十进制进行取反操作
* 10的二进制为:
* 0000 0000 0000 0000 0000 0000 0000 1010
* 1111 1111 1111 1111 1111 1111 1111 0101-->取反后的二进制为: -9
* */
System.out.println(~0010);

/**疑问: 如果直接对10进行取反操作,如:~10结果为什么是-11
* 好象对整数进行取反操作都会加1,如:~13结果为-14,其它数字也一样.
* 原理是什么?
* 通知参考李兴华老师的书籍得知:
* 在计算机的数据表示中只定义了正数的表示形式,并没有定义负数的表示形式,所以,
* 负数一般都用补码的形式表示,正数的原码、反码、补码都相同,负数的反码是除符号位为1外
* 其它位全取反: 补码就是 "反码+1"
* */
System.out.println(~13);//反码+1=-14
System.out.println(~-3);//反码+1=2

/**顺便也总结下左位移<<和右位移>>及无符号右位移>>>*/
//>>是将运算符的二进制码整体右移,右移之后空出来的位置以符号位填允
//如果是正数则使用0填充,如果说是负数则使用1填充
int x=3,y=-3;
System.out.println(x+"右移2位之后的内容: "+(x>>2));
System.out.println(y+"右移2位之后的内容: "+(y>>2));
/**
* 0000 0000 0000 0000 0000 0000 0000 0011 //3的二进制
* 0000 0000 0000 0000 0000 0000 0000 0000 //移出2位后,结果为0
*
* 1111 1111 1111 1111 1111 1111 1111 1101 //-3的二进制
* 1111 1111 1111 1111 1111 1111 1111 1111 //右移2位后,结果为-1
* */

//>>>无符号右位移,采用此操作将以0填充空出来的位->就是说不管正负都采用0填充空位
System.out.println(x+"无符号右移2位之后的内容: "+(x>>>2));
System.out.println(y+"无符号右移2位之后的内容: "+(y>>>2));

//总结: 对于位操作运算符,只适用于byte、short、int、char、long类型
/*介绍:
* 计算机由复杂电子元器件构成,一个电子元器件有带电和不带电的两种状态,1和0
多个这样的元器件的组合可以表示更多状态,也就是可以表示更多的数据,
一个元器件可以表示一位(bit)数据,这种表示数据的方式称为2进制
在实际的电子设备中,将8个元器件组合在一起,形成一个单元,这样的单元叫做一个字节(byte)
一个字节能表示2^8=256个数,即0-255
2个字节能表示2^16个数,即0-2^16-1
4个字节能表示2^32个数,即0-2^32-1
一个字节(byte)由8个二进位(bit)组成,
最右边的称为最低有效位,最左边的称为最高有效位
每一个二进位的值都是0或1*/
/*在计算机中常采用16位进制的方法,因为二进制书写太长,容易出错
16进制的f代表十进制中的15,在二进制中需要4位(bit)1111来书写
16进制中的ff代表十进制的255,在二进制中需要8位(bit)11111111来书写*/

//在计算机中只有数值,可以用数值表示不同的含义,如内存的数值可代表不同的含义

}
}