1:
~ (位非)翻转操作数的每一位。
& (位与)当且仅当两个操作数的某一位都非0时该位才为1 。
| (位或)只要两个数字的某一位有一个非0时该位就为1。
^ (位异)两个数字的某一位不相同时改位为1。
“<<”(位左移) 左数字按位左移右数字指定的数。
“>>” (位右移)左数字按位右移左数字指定的数。
“>>>”(位补零右移)左数字的值按右数字指定的位数向右移,移动得到的空位为零填补
位运算的优先等级:
~的优先级最高,其次是<<、>>和>>>,再次是&,然后是^,优先级最低的是|
在进行位运算时,需要注意以下几点:
1:>>>和>>的区别是:在执行运算时,>>>运算符的操作数高位补0,而**>>运算符的操作数高位移入原来高位的值**。
2:右移一位相当于除以2,左移一位(在不溢出的情况下)相当于乘以2;移位运算速度高于乘除运算。
3:若进行位逻辑运算的两个操作数的数据长度不相同,则返回值应该是数据长度较长的数据类型。
4:按位异或可以不使用临时变量完成两个值的交换,也可以使某个整型数的特定位的值翻转。
5:按位与运算可以用来屏蔽特定的位,也可以用来取某个数型数中某些特定的位。
:6:按位或运算可以用来对某个整型数的特定位的值置l。
在Java语言中,二进制数使用补码表示,最高位为符号位,正数的符号位为0,负数为1。补码的表示需要满足如下要求。
(1)正数的最高位为0,其余各位代表数值本身(二进制数)。
(2)对于负数,通过对该数绝对值的补码按位取反,再对整个数加1。
/**
表达式:运算的优先等级不用背,全部用();可以提高代码的可阅读性
*/
class JavaDemo4
{
public static void main(String[] args)
{
//System.out.println("Hello World!");
int a = 1;
int b = 1;
int c = a+b;
int d = 7/2;
//System.out.println(c);
//System.out.println(d);
//System.out.println(7/2);//"/"两边是整数,就是整除,结果为整数
//System.out.println(7.0/2);//"/"如果出现小数就不是整除。
//System.out.println(7%2);//取余数
int aa = 1;
//参考当前表达式,a++就是先用原来的值参与表达式运算,
//++a先自加运算,再用自加的结果参与表达式的运算。
System.out.println(1+(aa++)); //a = a+1; 2
System.out.println(3+(++aa));//3
System.out.println(2>3);
System.out.println(2<3);
//&与,&&短路与(在实际开发中一般使用短路与&&)
int temp = 1;
if((2<1)&&((temp=0)<2)){
System.out.println("成立"+temp);
}else{
System.out.println("不成立"+temp);
}
//|或,||短路或
int temp2 = 2;
if((2>1) || ((temp2 = 3)<2)){
System.out.println("成立"+temp2);
}else{
System.out.println("不成立"+temp2);
}
}
}
/**
位运算:
在计算机中负数是用补码表示,补码=源码取反再加一
*/
class JavaDemo5
{
public static void main(String[] args)
{
System.out.println(9&3);
System.out.println(9|3);
System.out.println(9^3);
System.out.println(~7);
System.out.println(7<<2);
System.out.println(-7>>>5);
System.out.println(8^3);
}
}