JAVA位运算符之简要说明

2019-04-13 21:42发布

首先要了解各个进制数之间的转换  例如:          十进制数    ->  二进制数
         0  ->  0
         1   ->  1
         2   ->  10
         3   ->  11
         4   ->  100
举例(计算机字长为8为列):
十进制数5: 原码: 0000 0101
反码:正数的反码与其原码相同,负数的反码为其原码除符号位以外的各位按位取反          0000 0101 补码:正数的补码与其原码相同,负数的补码为其反码在最低位加1          0000 0101   十进制数  -5: 原码: 0000 0101
反码: 1111 1010 补码: 1111 1011
位与(&)
运算规则:一真一假即为假,两假为假,两真为真。    例:0&0=0;   0&1=0;    1&0=0;     1&1=1;   //0 1 10 11 100 101 110 111 1000 1001 //0 1 2 3 4 5 6 7 8 9 int a = 5;//0 0101 int b = 6;//0 0110 //----------------------------------- //0 0100 System.out.println(a&b); //结果为4 //判断int型变量a是奇数还是偶数 //偶数的最后一位都是0 0&1 =》为0 所以结果只有0和1两个值 //a&1 = 0 偶数 //a&1 = 1 奇数 // & 和 && //前面是位运算符 ,后面是逻辑运算符。对于A&B,不管A是否为假,仍然要判断B。而A&&B 第一个不成立就不会去判断第二个了 if(a==b&b==c){ } //用&的话 程序会先判断a是否=b 如果不等于. 还要跳过判断b是否=c. if(a==b&&b==c){ } //&&的话..程序判断a!=b的话 直接后面的b是否=c就不做判断了


位或(|)
运算规则:有真则真,两假为假。   例:0|0=0;   0|1=1;   1|0=1;    1|1=1;

//0 1 10 11 100 101 110 111 1000 1001 //0 1 2 3 4 5 6 7 8 9 int a = 5;//0 0101 int b = 6;//0 0110 //----------------------------------- //00111 System.out.println(a|b); //结果7 // | 和 || //前面是位运算符 ,后面是逻辑运算符。对于A|B,不管A是否为假,仍然要判断B。而A||B 第一个成立就不会去判断第二个了

位异或(^)
运算规则:0^0=0;   0^1=1;   1^0=1;   1^1=0   //0 1 10 11 100 101 110 111 1000 1001 //0 1 2 3 4 5 6 7 8 9 int a = 5;//0 0101 int b = 6;//0 0110 //----------------------------------- //0 0011 System.out.println(a^b); //结果3

//不用第三变量,交互两个数的值 public static void swap(){ int a = 4; int b = 2; a ^= b; //a = a^b; a = 1 b ^= a; //b = b^a; b = 4 a ^= b; //a = a^b; a = 2; System.out.println("a="+a+" "+"b="+b); }

位非(~)
运算规则:~1=0;   ~0=1; //0 1 10 11 100 101 110 111 1000 1001 //0 1 2 3 4 5 6 7 8 9 int a = 5;//0000 0000 0000 0101 //----------------------------------- //1111 1111 1111 1010 这是-6 System.out.println(~a); //结果为 -6

右移(>>)

例如:a = a >> 3 将a的二进制位右移3位(将2转为2进制再进行位移) 2 => 10
右移两位
0010 => 0000  为0

3 => 11
右移一位
0011 => 0001  为1

无符号右移(>>>)
不管是正数还是负数左边都补0



左移(<<)

例如:a = a << 3 将a的二进制位左移3位

2 => 10
左移两位
0010 => 1000  为8

3 => 11
左移一位
0011 => 0110  为6


int mulTwo( int n){ //计算n*2 return n<<1; } int divTwoPower( int n, int m){ //计算n/(2^m) return n>>m; //除以2的m次方 } //求两个数的平均值 int getAverage( int x, int y){ return (x+y) >> 1 ; //将两个数的和右移一位 也就是除以2 }

二进制数10的十进制数为2,二进制数100的十进制数为4,以此类推,
可见十进制数的两倍这是二进制数左移了一位,
所以除以2的话就是右移1位了,如果要除以4 也就是 2*2 那就右移两位,以此类推。