当前位置:   article > 正文

Java中「与运算,或运算,异或运算,取反运算。」_java 或运算

java 或运算

Java中「与运算,或运算,异或运算,取反运算。」

Java中的「与运算(AND) & 」 规则 :都为1时才为1,否则为0

即:两位同时为“1”,结果才为“1”,否则为0。
例如:

public static void main(String args[]) {
    System.out.println( 7 & 9);

    /*
    * 7的二进制
    * 7/2=3...1
    * 3/2=1...1
    * 1/2=0...1
    * 直到商为0,将余数倒过来就是111
    * 于是得数是111
    */

    /*
    * 9的二进制
    * 9/2=4...1
    * 4/2=2...0
    * 2/2=1...0
    * 1/2=0...1
    * 于是得数是1001
    */

    /*
    *  7二进制 0111    
    *  9二进制 1001
    * ------------ 
    *          0001   ==1
    */        
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

Java中的「或运算(OR) | 」 规则 :有一个为1,则为1

即 :参加运算的两个对象只要有一个为1,其值为1。
例如:

public static void main(String args[]){
    System.out.println(7 | 9);
    /*
    * 7二进制 0111
    * 9二进制 1001
    * -----------
    *         1111 == 15
    * */    
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Java中的「异或运算(XOR) ^ 」 规则 :都不同时,为1

即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
例如:

public static void main(String args[]){
	System.out.println( 7 ^ 9);
    /*
    * 7二进制 0111
    * 9二进制 1001
    * ------------
    *        1110 == 14
     /
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

Java中的「取反运算(NOT) ~ 」 规则 :按位取反

  • 即:对一个二进制数按位取反,即将1变0,0变1。
  • 按位取反运算符“~”的原理:是将内存中的补码按位取反(包括符号位)。
  1. 二进制数在内存中是以补码的形式存放的。
  2. 补码首位是符号位,0表示此数为正数,1表示此数为负数。
  3. 正数的补码、反码,都是其本身。
  4. 负数的反码是:符号位为1,其余各位求反,但末位不加1 。
  5. 负数的补码是:符号位不变,其余各位求反,末位加1 。
  6. 所有的取反操作、加1、减1操作,都在有效位进行。

例如:正数

// 十进制转二进制
9/2=4...1
4/2=2...0
2/2=1...0
1/2=0...1

正数9(二进制为:1001)在内存中存储为01001,必须补上符号位(开头的数字0为符号位)。
转二进制:0 1001
计算补码:0 1001
按位取反:1 0110 (变成补码,这明显变成了一个负数补码,因为符号位是1)
补码减11 0101
在取反 :1 1010
符号位为1是负数,即-10

// 二进制转十进制
/*
* 二进制转为十进制要从右到左用二进制的每个数去乘以2的相应次方,小数点后则是从左往右。 
* 如果首位是0就表示正整数,如果首位是1则表示负整数,正整数可以直接换算,负整数则需要先取反再换算。
* 因为计算机内部表示数的字节单位是定长的。 如8位、16位、32位
**/
// 首位1表示负数 1010转十进制(1*2^3+0*2^2+1*2^1+0*2^0=10),所以取反为-10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

例如:负数

// 十进制转二进制
-1/2=0...1

负数-1(二进制为:0001)在内存中存储为10001,必须补上符号位(开头的数字1为符号位)。
-1的反码为11110
-1的补码为11111 (也可以理解为:反码末位加上1就是补码)
~-1的取反 0 0000
~-1结果为:0
// 二进制转十进制
/*
* 二进制转为十进制要从右到左用二进制的每个数去乘以2的相应次方,小数点后则是从左往右。 
* 如果首位是0就表示正整数,如果首位是1则表示负整数,正整数可以直接换算,负整数则需要先取反再换算。
* 因为计算机内部表示数的字节单位是定长的。 如8位、16位、32位
**/
// 首位是0 表示为正数 0
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

例1:

public static void main(String args[]){
    System.out.println(~7);//正数    

    /*
    * 7二进制 0000 0000 0000 0000 0000 0000 0000 0111
    *         0000 0000 0000 0000 0000 0000 0000 0111 反码
    *         0000 0000 0000 0000 0000 0000 0000 0111 补码        
    *         1000 0000 0000 0000 0000 0000 0000 1000 得到正数的补码之后进行取反 (这时得到的是负数)符号位为: 1
    *         所以~7的值为:-8
    */
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

例2:

public static void main(String args[]){
    System.out.println(~-1);//负数

	/*
   * -1二进制 1000 0000 0000 0000 0000 0000 0000 0001
   *         1000 0000 0000 0000 0000 0000 0000 1110  反码(负数的反码是:符号位为1,其余各位求反,但末位不加1。)
   *         1000 0000 0000 0000 0000 0000 0000 1111  补码(负数的补码是:符号位不变,其余各位求反,末位加1 。)
   *         0000 0000 0000 0000 0000 0000 0000 0000  得到负数的补码之后进行取反 (这时得到的是正数) 符号位为: 0
   *         所以~-1的值为:0
   */
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

进制转换工具

https://www.sojson.com/hexconvert/2to10.html

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/215208
推荐阅读
相关标签
  

闽ICP备14008679号