学习笔记——位运算符

位运算符就是直接操作二进制的
位运算符有:
&(与)
|(或)
^(异或)
~(取反)

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

你可能感兴趣的:(java基础学习笔记,java基础)