/**********************************************************************************
*
* 文件名: BitOperator.java
*
* 描述:位运算 知识点+课后练习
*
* 知识点1:原码 反码 补码
* 1.二进制的最高位是符号位:0表示正数,1表示负数
* 2.正数的原码、反码、补码都一样(三码合一)
* 3.负数的反码 = 它的原码符号位不变,其它位取反(0->1,1->0)
* 4.负数的补码 = 它的反码 + 1,负数的反码 = 负数的补码 - 1
* 5.0的反码、补码都是0
* 6.java没有无符号数,换言之,java中的数都是有符号的
* 7.在计算机运算的时候,都是以补码的方式来运算的(重点)
* 8.当我们看运算结果的时候,要看它的原码(重点)
*
* 知识点2:按位与& 按位或| 按位异或^ 按位取反~
* 按位与& : 两位全为1,结果为1,否则为0
* 按位或| : 两位有一个为1,结果为1,否则为0
* 按位异或^ : 两位一个为0一个为1,结果为1,否则为0(相同为0,不同为1)
* 按位取反~ : 0->1,1->0
*
* 知识点3:算术右移>> 算术左移<< 逻辑右移>>>
* 算术右移>> : 低位溢出,符号位不变,并用符号位补溢出的高位
* 算术左移<< : 符号位不变,低位补0
* 逻辑右移>>> : 也称无符号右移,运算规则是:低位溢出,高位补0
* 注:没有<<<符号
*
* 编码:GBK
*
*********************************************************************************/
public class BitOperator {
public static void main(String[] args) {
//练习1
//1的原码/反码/补码:00000000 00000000 00000000 00000001
//1>>2补码/反码/原码:00000000 00000000 00000000 00000000 即为0
//本质是 1/2/2 = 0 (仅对正数)
int a1 = 1>>2;
//-1的原码:10000000 00000000 00000000 00000001
//-1的反码:11111111 11111111 11111111 11111110
//-1的补码:11111111 11111111 11111111 11111111
//-1>>2的补码:11111111 11111111 11111111 11111111
//-1>>2的反码:11111111 11111111 11111111 11111110
//-1>>2的原码:10000000 00000000 00000000 00000001 即为-1
int b1 = -1>>2;
//1的原码/反码/补码:00000000 00000000 00000000 00000001
//1<<2补码/反码/原码:00000000 00000000 00000000 00000100 即为4
//本质是 1*2*2 = 4(仅对正数)
int c1 = 1<<2;
//-1的原码:10000000 00000000 00000000 00000001
//-1的反码:11111111 11111111 11111111 11111110
//-1的补码:11111111 11111111 11111111 11111111
//-1<<2的补码:11111111 11111111 11111111 11111100
//-1<<2的反码:11111111 11111111 11111111 11111011
//-1<<2的原码:10000000 00000000 00000000 00000100 即为-4
int d1 = -1<<2;
//3的原码/反码/补码:00000000 00000000 00000000 00000011
//3>>>2的补码/反码/原码为:000000000 00000000 00000000 00000000 即为0
int e1 = 3>>>2;
System.out.println("a1=" + a1);
System.out.println("b1=" + b1);
System.out.println("c1=" + c1);
System.out.println("d1=" + d1);
System.out.println("e1=" + e1);
//练习2
//2的原码/反码/补码:00000000 00000000 00000000 00000010
//~2的补码:11111111 11111111 11111111 11111101
//~2的反码:11111111 11111111 11111111 11111100
//~2的原码:10000000 00000000 00000000 00000011 即为-3
int a2 = ~2;
//2的原码/反码/补码:00000000 00000000 00000000 00000010
//3的原码/反码/补码:00000000 00000000 00000000 00000011
//2&3的补码/反码/原码:00000000 00000000 00000000 00000010 即为2
int b2 = 2&3;
//2的原码/反码/补码:00000000 00000000 00000000 00000010
//3的原码/反码/补码:00000000 00000000 00000000 00000011
//2|3的补码/反码/原码:00000000 00000000 00000000 00000011 即为3
int c2 = 2|3;
//5的原码/反码/补码:00000000 00000000 00000000 00000101
//~5的补码:11111111 11111111 11111111 11111010
//~5的反码:11111111 11111111 11111111 11111001
//~5的原码:10000000 00000000 00000000 00000110 即为-6
int d2 = ~5;
//13的原码/反码/补码:00000000 00000000 00000000 00001101
//7的原码/反码/补码:00000000 00000000 00000000 00000111
//13&7的补码/反码/原码:00000000 00000000 00000000 000000101 即为5
int e2 = 13&7;
//5的原码/反码/补码:00000000 00000000 00000000 00000101
//4的原码/反码/补码:00000000 00000000 00000000 00000100
//5|4的补码/反码/原码:00000000 00000000 00000000 00000101 即为5
int f2 = 5|4;
//-3的原码:10000000 00000000 00000000 00000011
//-3的反码:11111111 11111111 11111111 11111100
//-3的补码:11111111 11111111 11111111 11111101
//3的原码/反码/补码:00000000 00000000 00000000 00000011
//-3^3的补码:11111111 11111111 11111111 11111110
//-3^3的反码:11111111 11111111 11111111 11111101
//-3^3的原码:10000000 00000000 00000000 00000010 即为-2
int g2 = -3^3;
System.out.println("a2=" + a2);
System.out.println("b2=" + b2);
System.out.println("c2=" + c2);
System.out.println("d2=" + d2);
System.out.println("e2=" + e2);
System.out.println("f2=" + f2);
System.out.println("g2=" + g2);
}
}
Java学习笔记003——位运算细节
于 2022-04-08 18:00:27 首次发布