整型数据在内存中以二进制的形式表示,例如一个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); }}
结果:
密文:匀烸辚敺 原文:十点进攻