异或运算(^)都以二进制数据为基础进行的运算。也就是说当代码中使用到异或运算时,都会先将两个条件进行转换,转换成二进制数据后,再进行运算。异域中同位如果值相同(都是0或者都是1)则为0,不同(一个是0,一个是1)为1。
十载品牌的成都网站建设公司,上千多家企业网站设计经验.价格合理,可准确把握网页设计诉求.提供定制网站建设、商城网站建设、重庆小程序开发、响应式网站建设等服务,我们设计的作品屡获殊荣,是您值得信赖的专业网站制作公司。
例如
int a=4;
int b=6;
int c = a^b;//c的值是a和b的异或。值为2.过程
1、a的值二进制是
0000 0100 //这里去低8位,因为高位都一致。 2、b的值二进制是
0000 0110 3、异或后
0000 0010 //结果是2
Java代码:
public class test{
public static void main(String[] args) {
String source = "cghjhgfgsdyugh";
int ch = source.charAt(0);
for(int i=1; isource.length(); i++) {
ch ^= source.charAt(i);
}
System.out.printf("%d : %c\n", ch, ch);
}
}
运行测试:
28 :
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class XorExample {
public static final byte XOR_CONST = 0X12;
public static void main(String[] args) throws Exception {
File src = new File("level1.txt");
File dest = new File("level2.txt");
File dest2 = new File("level3.txt");
xorEn(src, dest);
xorEn(dest, dest2);
}
/**
* 异或的一个特点: a^b = c c^b = a
* 所以简单点,这里的加解密都用一个函数就行了
* @param src
* @param dest
* @throws Exception
*/
public static void xorEn(File src, File dest) throws Exception {
// 文件不存在或为文件夹就不判断了
FileInputStream fis = new FileInputStream(src);
FileOutputStream fos = new FileOutputStream(dest);
byte[] bs = new byte[1024];
int len = 0;
while ((len = fis.read(bs)) != -1) {
for (int i = 0; i len; i++) {
bs[i] ^= XOR_CONST;
}
fos.write(bs, 0, len);
}
fos.close();
fis.close();
}
}
java和c的执行是不一致的
相同之处:i ^= (j ^= (i ^= j)); java和C都是这个执行顺序;
不同之处:
java:执行完第一个(i ^= j)的时候,最左边的i的值还是1而不会是(i ^= j)的值
C:执行完第一个(i ^= j)的时候,最左边(第一个)i的值是(i ^= j)
你的程序改成这样就可以了:
j ^= i ^= j;
i ^= j;
或
i =i^j;
j=i^j;
i=i^j;
java中或运算、异或运算、与运算的使用实例和解释如下:
public class Test { public static void main(String[] args) {
// 1、左移( )
// 0000 0000 0000 0000 0000 0000 0000 0101 然后左移2位后,低位补0:
// // 0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20 System.out.println(5 2);// 运行结果是20
// 2、右移( ) 高位补符号位
// 0000 0000 0000 0000 0000 0000 0000 0101 然后右移2位,高位补0:
// 0000 0000 0000 0000 0000 0000 0000 0001
System.out.println(5 2);// 运行结果是1
// 3、无符号右移( ) 高位补0
// 例如 -5换算成二进制后为:0101 取反加1为1011
// 1111 1111 1111 1111 1111 1111 1111 1011 /
/ 我们分别对5进行右移3位、 -5进行右移3位和无符号右移3位:
System.out.println(5 3);// 结果是0
System.out.println(-5 3);// 结果是-1
System.out.println(-5 3);// 结果是536870911
// 4、位与( )
// 位与:第一个操作数的的第n位于第二个操作数的第n位如果都是1,那么结果的第n为也为1,否则为0
System.out.println(5 3);// 结果为1
System.out.println(4 1);// 结果为0
// 5、位或( | )
// 第一个操作数的的第n位于第二个操作数的第n位 只要有一个是1,那么结果的第n为也为1,否则为0
System.out.println(5 | 3);// 结果为7
// 6、位异或( ^ )
// 第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0
System.out.println(5 ^ 3);//结果为6
// 7、位非( ~ ) // 操作数的第n位为1,那么结果的第n位为0,反之。 System.out.println(~5);// 结果为-6 } }
异或运算(^)都以二进制数据为基础进行的运算。也就是说当代码中使用到异或运算时,都会先将两个条件进行转换,转换成二进制数据后,再进行运算。异域中同位如果值相同(都是0或者都是1)则为0,不同(一个是0,一个是1)为1。
例如
int a=4;
int b=6;
int c = a^b;//c的值是a和b的异或。值为2.
过程
1、a的值二进制是
0000 0100 //这里去低8位,因为高位都一致。
2、b的值二进制是
0000 0110
3、异或后
0000 0010 //结果是2