整型数据在内存中以二进制的形式表示,例如一个int整型变量在内存中占4个字节共32位,int型数据7的二进制表示:

00000000 00000000 00000000 00000111

        左边最高位为符号位,最高位是0表示正数,最高位是1表示负数。负数采用补码形式表示,例如-8的补码表示是:

负数补码相对原码,按位取反末尾加 1:

11111111 11111111 11111111 11111000

        这样就可以对两个整型数据实施位运算,即对两个整型数据对应的位进行运算得到一个新的整型数据。

一、按位与运算
        按位与运算&是双目运算符,对两个整型数据a、b按位进行运算,运算结果是一个整型数据c。运算法则是:如果a、b两个数据对应位都是1,则c的该位是1,否则是0.如果b的精度高于a,那么结果c的精度和b相同。

例如:

	 a: 00000000 00000000 00000000 00000111&    b: 10000001 10100101 11110011 10101011----------------------------------------------
	 c: 00000000 00000000 00000000 00000011

二、按位或运算
        按位或运算符|是二目运算符,对两个整型数据a,b按位进行运算,运算结果是一个整型数据c。运算法则是:如果a、b两个数据对应位都是0,则c的该位是0,否则是1。如果b的精度高于a,那么结果c的精度和b相同。

三、按位非运算
        按位非运算符~是单目运算符,对一个整型数据a按位进行运算,运算结果是一个整型数据c。运算法则是:如果a对应是0,则c的该位是1,否则是0。

四、按位异或运算
        按位异或运算^是二目运算符,对两个整型数据a按位进行运算,运算结果是一个整型数据c。运算法则是:如果a,b两个数据对应位是相同的,则c的该位是0,否则是1。如果b的精度高于a,则结果c的精度和b相同。

由异或运算法则可知:a ^ a=0, a ^ 0=a,
因此,如果c=a ^ b,那么a=c ^ b,也就是说,^ 的逆运算仍然是 ^,即a ^ b ^ b等于a
位运算符也可以操作逻辑型数据,法则是:
当a、b都是true时,a&b是true,否则a&b是false
当a、b都是false时,a|b是false,否则是true
当a是true时,a是false;当a是false时,a是true

位运算符在操作逻辑型数据时,与逻辑运算符&&、||、!不同的是:位运算符要计算完a和b的值之后再给出运算的结果。例如,x的初值是1,那么经过下列逻辑比较运算后,

((y=1)==0)&&((x=6)==6);

x的值仍然是1,但是如果经过下列位运算之后,

((y=1)==0)&((x=6)==6);

x的值将是6。

例子:

public class Test {
	public static void main(String[] args) {
		char a1='十', a2='点', a3='进', a4='攻';
		char secret = 'A';
		
		a1 = (char)(a1^secret);
		a2 = (char)(a2^secret);
		a3 = (char)(a3^secret);
		a4 = (char)(a4^secret);
		
		System.out.println("密文:"+a1+a2+a3+a4);
		
		a1 = (char)(a1^secret);
		a2 = (char)(a2^secret);
		a3 = (char)(a3^secret);
		a4 = (char)(a4^secret);
		
		System.out.println("原文:"+a1+a2+a3+a4);
	}}

结果:

密文:匀烸辚敺
原文:十点进攻