JAVA按位逻辑运算基本教程(1)

1、基本概念html

 

全部的整数类型以二进制数字位的变化及其宽度来表示。例如,byte 型值42的二进制代码是00101010 ,其中每一个位置在此表明2的次方,在最右边的位以20开始。向左下一个位置将是21,或2,依次向左是22,或4,而后是8,16,32等等,依此类推。所以42在其位置1,3,5的值为1(从右边以0开始数);这样42是21+23+25的和,也便是2+8+32 。java

全部的整数类型(除了char 类型以外)都是有符号的整数。这意味着他们既能表示正数,又能表示负数。Java 使用你们知道的2的补码(two's complement )这种编码来表示负数,也就是经过将与其对应的正数的二进制代码取反(即将1变成0,将0变成1),而后对其结果加1。例如,-42就是经过将42的二进制代码的各个位取反,即对00101010 取反获得11010101 ,而后再加1,获得11010110 ,即-42 。要对一个负数解码,首先对其全部的位取反,而后加1。例如-42,或11010110 取反后为00101001 ,或41,而后加1,这样就获得了42。编码

若是考虑到零的交叉(zero crossing )问题,你就容易理解Java (以及其余绝大多数语言)这样用2的补码的缘由。假定byte 类型的值零用00000000 表明。它的补码是仅仅将它的每一位取反,即生成11111111 ,它表明负零。但问题是负零在整数数学中是无效的。为了解决负零的问题,在使用2的补码表明负数的值时,对其值加1。即负零11111111 加1后为100000000 。但这样使1位太靠左而不适合返回到byte 类型的值,所以人们规定,-0和0的表示方法同样,-1的解码为11111111 。尽管咱们在这个例子使用了byte 类型的值,但一样的基本的原则也适用于全部Java 的整数类型。spa

由于Java 使用2的补码来存储负数,而且由于Java 中的全部整数都是有符号的,这样应用位运算符能够容易地达到意想不到的结果。例如,无论你如何打算,Java 用高位来表明负数。为避免这个讨厌的意外,请记住无论高位的顺序如何,它决定一个整数的符号。htm

2、位逻辑运算符ci

位逻辑运算符有“与”(AND)、“或”(OR)、“异或(XOR )”、“非(NOT)”,分别用“&”、“|”、“^”、“~”表示,4-3 表显示了每一个位逻辑运算的结果。在继续讨论以前,请记住位运算符应用于每一个运算数内的每一个单独的位。get

表4-3 位逻辑运算符的结果数学

A 0 1 0 1 B 0 0 1 1 A | B 0 1 1 1 A & B 0 0 0 1 A ^ B 0 1 1 0 ~A 1 0 1 0it

按位非(NOT)table

按位非也叫作补,一元运算符NOT“~”是对其运算数的每一位取反。例如,数字42,它的二进制代码为:

00101010

通过按位非运算成为

11010101

按位与(AND)

按位与运算符“&”,若是两个运算数都是1,则结果为1。其余状况下,结果均为零。看下面的例子:

 

00101010 42 &00001111 15

00001010 10

按位或(OR)

按位或运算符“|”,任何一个运算数为1,则结果为1。以下面的例子所示:

 

00101010 42 | 00001111 15

00101111 47

按位异或(XOR)

按位异或运算符“^”,只有在两个比较的位不一样时其结果是 1。不然,结果是零。下面的例子显示了“^”运算符的效果。这个例子也代表了XOR 运算符的一个有用的属性。注意第二个运算数有数字1的位,42对应二进制代码的对应位是如何被转换的。第二个运算数有数字0的位,第一个运算数对应位的数字不变。当对某些类型进行位运算时,你将会看到这个属性的用处。

 

00101010 42 ^ 00001111 15

00100101 37

位逻辑运算符的应用

下面的例子说明了位逻辑运算符:

 

// Demonstrate the bitwise logical operators.

class BitLogic {

public static void main(String args[]) {String binary[] = {"0000", "0001",

"0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100",

"1101", "1110", "1111" };

int a = 3; // 0 + 2 + 1 or 0011 in binary

int b = 6; // 4 + 2 + 0 or 0110 in binary

int c = a | b;

int d = a & b;

int e = a ^ b;

int f = (~a & b) | (a & ~b);

int g = ~a & 0x0f; System.out.println(" a = " + binary[a]);

System.out.println(" b = " + binary[b]);

System.out.println(" a|b = " + binary[c]);

System.out.println(" a&b = " + binary[d]);

System.out.println(" a^b = " + binary[e]);

System.out.println("~a&b|a&~b = " + binary[f]);

System.out.println(" ~a = " + binary[g]);

}

相关文章
相关标签/搜索