位运算符就是直接操作二进制的
位运算符有:
&(与)
|(或)
^(异或)
~(取反)
6&3;
以上程序结果为:2
运算过程:
6的二进制:00000110 (1看成true,0看成false)
3的二进制:00000011
&
----------------
00000010
00000010的十进制结果为2,所以6&3结果为2。
6|3;
以上程序结果为:7
运算过程:
6的二进制:00000110 (1看成true,0看成false)
3的二进制:00000011
|
-----------------
00000111
00000111的十进制结果为:7,所以6|3的结果为7。
6^3;
以上程序结果为:5
运算过程:
6的二进制:00000110 (相同为false,不同为true)
3的二进制:00000011
^
----------------
00000101
00000101的十进制结果为5,所以6^3的结果为5
^规律:如果一个操作数A连续异或同一个操作数两次,那么结果还是A。
应用:对数据进行加密
import java.io.*;
class ImageTest
class ImageTest
{
public static void main(String[] args) throws Exception
{
//找到图片文件
File inFile = new File("e:\\加密的图片.jpg");
File outFile = new File("e:\\解密的图片.jpg");
//建立数据通道,让图片的二进制数据流入
FileInputStream input = new FileInputStream(inFile);
FileOutputStream output = new FileOutputStream(outFile);
//边读,把读到的数据异或一个数据,把把数据写出
int content = 0; //该变量是用于存储读取到的数据
while((content = input.read())!=-1){ // 如果没有到文件的末尾,那么继续读取数据,读取到的数据已经存储到content变量中了。
output.write(content^12);
}
//关闭资源
output.close();
input.close();
}
}
~7;
以上程序结果为:-8
运算过程:
7的二进制为00000111
取反得 11111000(这是一个负数,称为补码)
求11111000的原码(-1)
-00000001
----------------
11110111
11110111取反得00001000,加上-号,结果为-8
补充:位运算符可能出现的笔试题目:
1.交换两个变量的值,不能出现第三变量
2.取出一个二进制数据的指定位数
1.int a=3;
int b=5;
方法一:相加法 缺点:两个int数据相加有可能会超出int的取值范围
a=a+b;
b=a-b;
a=a-b;
方法二:可以使用^ 缺点:逻辑不清晰
a=a^b;
b=a^b;
a=a^b;
2.要求读取二进制的低四位
00000000 01001101 (要读取的二进制数)
&00000000 00001111 (与一个二进制数,除了低四位的数都为1,其余位数都为0)
------------------------------
1101