Java位运算符

Bertha 。 2022-08-08 12:45 238阅读 0赞



计算机内部的数据都以二进制的形式存在,二进制数据最高位是符号位,正数是0,负数为1;正数的原码、反码、补码都是一样的,负数的反码为原码的符号位不变,其它位取反,即0->1,1->0;而负数的补码等于反码加1;0的反码、补码都是0;在计算机进行运算的时候,都是以补码的方式运算。

Java语言中的位运算符主要有4种:&(位与)、|(位或)、^(异或)和~(按位取反),下面依次介绍运算规则和使用示例。

& (位与):

运算规则:二进制位都为1,则结果为1,否则为0。

例如:

正数:

3&5

3的二进制形式为:0000 0000 0000 0000 0000 0000 0000 0011

5的二进制形式为:0000 0000 0000 0000 0000 0000 0000 0101

因为3和5都是整数,所以补码就是它们的原码,即二进制形式。

根据计算规则,结果为:0000 0000 0000 0000 0000 0000 0000 0001, 即1。

负数:

-3&-6

-3的二进制形式为:1000 0000 0000 0000 0000 0000 0000 0011

-6的二进制形式为:1000 0000 0000 0000 0000 0000 0000 0110

-3的二进制反码为:1111 1111 1111 1111 1111 1111 1111 1100

-6的二进制反码为:1111 1111 1111 1111 1111 1111 1111 1001

-3的二进制补码(反码+1)为:1111 1111 1111 1111 1111 1111 1111 1101

-6的二进制补码(反码+1)为:1111 1111 1111 1111 1111 1111 1111 1010

根据-3和-6的补码进行&运算,结果为:1111 1111 1111 1111 1111 1111 1111 1000

结果为负数,所以需再换算,把所得的补码换算成原码,即-1得到反码, 再反码得到原码:

结果的反码为:1111 1111 1111 1111 1111 1111 1111 0111

再反码得到原码:1000 0000 0000 0000 0000 0000 0000 1000, 即-8。

代码测试:

public class BitOperator {

public static void main(String[] args) {
System.out.println(“3&5: “+(3&5));
System.out.println(“(-3)&(-6): “+((-3)&(-6)));
}

}

输出:

3&5: 1
(-3)&(-6): -8

| (位或):

运算规则:二进制位有一个为1,则结果为1,否则为0。

例如:

正数:

3|5

3的二进制形式为:0000 0000 0000 0000 0000 0000 0000 0011

5的二进制形式为:0000 0000 0000 0000 0000 0000 0000 0101

因为3和5都是整数,所以补码就是它们的原码,即二进制形式。

根据计算规则,结果为:0000 0000 0000 0000 0000 0000 0000 0111, 即7。

负数:

-3|-6

-3的二进制形式为:1000 0000 0000 0000 0000 0000 0000 0011

-6的二进制形式为:1000 0000 0000 0000 0000 0000 0000 0110

-3的二进制反码为:1111 1111 1111 1111 1111 1111 1111 1100

-6的二进制反码为:1111 1111 1111 1111 1111 1111 1111 1001

-3的二进制补码(反码+1)为:1111 1111 1111 1111 1111 1111 1111 1101

-6的二进制补码(反码+1)为:1111 1111 1111 1111 1111 1111 1111 1010

根据-3和-6的补码进行 | 运算,结果为:1111 1111 1111 1111 1111 1111 1111 1111

结果为负数,所以需再换算,把所得的补码换算成原码,即-1得到反码, 再反码得到原码:

结果的反码为:1111 1111 1111 1111 1111 1111 1111 1110

再反码得到原码:1000 0000 0000 0000 0000 0000 0000 0001, 即-1。

代码测试:

public class BitOperator {

public static void main(String[] args) {
System.out.println(“3|5: “+(3|5));
System.out.println(“(-3)|(-6): “+((-3)|(-6)));
}

}

输出:

3|5: 7
(-3)|(-6): -1

^ (异或):

运算规则:二进制位不同为1,相同为0。

例如:

正数:

3^5

3的二进制形式为:0000 0000 0000 0000 0000 0000 0000 0011

5的二进制形式为:0000 0000 0000 0000 0000 0000 0000 0101

因为3和5都是正数,所以补码就是它们的原码,即二进制形式。

根据计算规则,结果为:0000 0000 0000 0000 0000 0000 0000 0110, 即6。

负数:

-3^-6

-3的二进制形式为:1000 0000 0000 0000 0000 0000 0000 0011

-6的二进制形式为:1000 0000 0000 0000 0000 0000 0000 0110

-3的二进制反码为:1111 1111 1111 1111 1111 1111 1111 1100

-6的二进制反码为:1111 1111 1111 1111 1111 1111 1111 1001

-3的二进制补码(反码+1)为:1111 1111 1111 1111 1111 1111 1111 1101

-6的二进制补码(反码+1)为:1111 1111 1111 1111 1111 1111 1111 1010

根据-3和-6的补码进行 ^ 运算,结果为:0000 0000 0000 0000 0000 0000 0000 0111

结果为正数,所以无需再换算, 即7。

代码测试:

public class BitOperator {

public static void main(String[] args) {
System.out.println(“3^5: “+(3^5));
System.out.println(“(-3)^(-6): “+((-3)^(-6)));
}

}

输出:

3^5: 6
(-3)^(-6): 7

~ (按位取反):

运算规则:二进制位1变为0,0变为1。

例如:

正数:

~3

3的二进制形式为:0000 0000 0000 0000 0000 0000 0000 0011

根据计算规则,结果为:1111 1111 1111 1111 1111 1111 1111 1100。

结果为负数,所以需再换算,把所得的补码换算成原码,即-1得到反码, 再反码得到原码:

结果的反码为:1111 1111 1111 1111 1111 1111 1111 1011

再反码得到原码:1000 0000 0000 0000 0000 0000 0000 0100, 即-4。

负数:

~(-3)

-3的二进制形式为:1000 0000 0000 0000 0000 0000 0000 0011

-3的二进制反码为:1111 1111 1111 1111 1111 1111 1111 1100

-3的二进制补码(反码+1)为:1111 1111 1111 1111 1111 1111 1111 1101

根据-3的补码进行 ~ 运算,结果为:0000 0000 0000 0000 0000 0000 0000 0010

结果为正数,所以无需再换算, 即2。

代码测试:

public class BitOperator {

public static void main(String[] args) {
System.out.println(“~3: “+(~3));
System.out.println(“~(-3): “+(~(-3)));
}

}

输出:

~3: -4
~(-3): 2

实际使用简单示例:

原文:http://blog.csdn.net/mailbomb/article/details/2492361

l 把任意数字转换为正数

假设n是一个任意的整数,则把n转换为正数的代码为:

  1. int m = n & 0x7fffffff;

l 判断任意数字倒数第三位的值是否为1

假设n是一个任意的整数,则判断的代码为:

int m = n & 0x4;

boolean b = (m != 0);

l 将任意数字倒数第四位置为1

假设n是一个任意的整数,则代码为:

  1. int m = n | 0x8;

发表评论

表情:
评论列表 (有 0 条评论,238人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java运算符

    运算符 * 把操作数转为二进制,参与运算,最终的到二进制的结果转为十进制 * & : 比较统一位置的两个数,如果一个0就是0,两个都为1才是1...

    相关 Java 运算符

    简介 将数值进行二进制层面上的比较再转换成十进制 种类 1. `^(and)` 转换成二进制,对应两个位置一样变为0,不一样变为1 2. `|(or)` 转换

    相关 Java运算符

    位运算符主要针对二进制,包括“与”、“非”、“或”、“异或”。 与运算符“&” 使用规律:两个操作数中位都为1,结果才为1,否则结果为0。 public

    相关 Java运算符

     计算机内部的数据都以二进制的形式存在,二进制数据最高位是符号位,正数是0,负数为1;正数的原码、反码、补码都是一样的,负数的反码为原码的符号位不变,其它位取反,即0->