位运算符,&、|、~、^、<<、>>、>>>
位运算符主要针对二进制,它包括了:”与“、”或“、”非“、”异或“,与逻辑运算符符号相识,但逻辑运算符是针对两个关系来进行逻辑运算。
1.与运算符,符号:&,
==使用规律:两个操作数中,对应位都为 1,结果才为 1,否则结果为 0==
public static void andOperator() {
int a = 129, b = 128;
String aBinaryCode = Integer.toString(a, 2);
String bBinaryCode = Integer.toString(b, 2);
System.out.println("a的二进制表示为:" + aBinaryCode);
System.out.println("b的二进制表示为:" + bBinaryCode);
System.out.println("a&b二进制表示为: " + Integer.toString((a & b), 2));
System.out.println("a&b的结果是: " + (a & b));
}
2.或运算符,符号:|
==使用规律:两个操作数中,对应位只要有一个为 1,结果才为 1,否则结果为 0==
public static void orOperator() {
int a = 129, b = 128;
String aBinaryCode = Integer.toString(a, 2);
String bBinaryCode = Integer.toString(b, 2);
System.out.println("a的二进制表示为:" + aBinaryCode);
System.out.println("b的二进制表示为:" + bBinaryCode);
System.out.println("a|b二进制表示为: " + Integer.toString((a | b), 2));
System.out.println("a|b的结果是: " + (a | b));
}
3.非运算符,符号:~
==使用规律:如果位为 0,结果为 1、如果位为 1,结果为 0,按位取反==
public static void notOperator() {
int a = -37;
String aBinaryCode = Integer.toString(a, 2);
System.out.println("a的二进制表示为:" + aBinaryCode);
System.out.println("~a二进制表示为: " + Integer.toString(~a, 2));
System.out.println("~a的结果是: " + ~a);
/**
* int 长度为8个字节,一个字节8位,占32位
* 以37为例:转为二进制:100101,
* 补码为:00000000 00000000 00000000 00100101
* 取反为:11111111 11111111 11111111 11011010
* 因为最高为是1,所以原码为负数,负数的补码是其绝对值的原码取反,末尾再加1
* 所以将补码还原 ,高位不变,是减1,再取反 减一后为:11111111 11111111 11111111 11011001
* 取反后为:10000000 00000000 00000000 00100110
* 为-38
* 个人总结(不一定对,仅供参考):~运算符,为将原来的值+1,再加-号(负号)
* eg:~36=-37、~(-36)=35
*/
}
4.异或运算符,符号:^
==使用规律:两个操作数中,对应位相同,结果才为 0,否则结果为 1==
public static void xorOperator() {
int a = 129, b = 128;
String aBinaryCode = Integer.toString(a, 2);
String bBinaryCode = Integer.toString(b, 2);
System.out.println("a的二进制表示为:" + aBinaryCode);
System.out.println("b的二进制表示为:" + bBinaryCode);
System.out.println("a^b二进制表示为: " + Integer.toString((a ^ b), 2));
System.out.println("a^b的结果是: " + (a ^ b));
}
5.左移运算符,符号:<<
==使用规律:左操作数,按为左移右操作数指定位数(后面直接补 0)==
eg:2 << 3=2*Math.pow(2,3)
public static void moveLeft() {
int a = 2;
String aBinaryCode = Integer.toString(a, 2);
System.out.println("a的二进制表示为:" + aBinaryCode);
System.out.println("a<<3二进制表示为: " + Integer.toString(a << 3, 2));
System.out.println("a<<3的结果是: " + (a << 3));
}
6.右移运算符,符号:>>
==使用规律:左操作数,按为右移右操作数指定位数 eg:8 >> 3=8/Math.pow(2,3)==
如果该数为正,则高位补 0,而若该数为负数,则右移后高位补 1,以上特性不变
public static void moveRight() {
int a = 8;
String aBinaryCode = Integer.toString(a, 2);
System.out.println("a的二进制表示为:" + aBinaryCode);
System.out.println("a>>3二进制表示为: " + Integer.toString(a >> 3, 2));
System.out.println("a>>3的结果是: " + (a >> 3));
}
7.无符号右移运算符,符号:>>>
==也叫逻辑右移,即该数为正,则高位补 0,而若该数为负数,则右移后高位同样补 0==
public static void moveLogicRight() {
//a为正数时,>> 和 >>>没有区别,正数的原码,补码,反码基本不变
int a = 8;
String aBinaryCode = Integer.toString(a, 2);
System.out.println("a的二进制表示为:" + aBinaryCode);
System.out.println("a>>>3二进制表示为: " + Integer.toString(a >>> 3, 2));
System.out.println("a>>>3的结果是: " + (a >>> 3));
//当a为负数时
int b = -8;
String bBinaryCode = Integer.toString(b, 2);
System.out.println("b的二进制表示为:" + bBinaryCode);
System.out.println("b>>>3二进制表示为: " + Integer.toString(b >>> 3, 2));
System.out.println("b>>>3的结果是: " + (b >>> 3));
/**
* 负数的二进制为其正数的补码+1,第一位改为1 本例: b=-8
* 原码:最高位为1 ,其余位为其正数的二进制 : 10000000 00000000 00000000 00001000
* 反码:按位取反,11111111 11111111 11111111 11110111
* 补码:最高位不变,其它位按位取反 然后+1 (针对原码而言),
* 实际就是反码+1 ,注意逢2进1 :11111111 11111111 11111111 11111000
* 右移三位:高位补0:: 00011111 11111111 11111111 11111111
* 位运算都是对补码左右移
* System.out.println(Integer.parseInt("00011111111111111111111111111111",2));
*/
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于