您的位置:首页 > 其它

按位与,按位或,按位异或,按位取反

2013-07-15 19:56 232 查看

转载请注明出处:http://blog.csdn.net/droyon/article/details/9335537

一、按位与

运算规则:1&1=1,1&0=0,0&1=0;

用途:清零,取指定位

int i=7;//0000 0000   0000 0000    0000 0000    0000 0111
int j=5;//0000 0000   0000 0000    0000 0000    0000 0101

int m=-7;//1000 0000   0000 0000    0000 0000    0000 0111
int n=-5;//1000 0000   0000 0000    0000 0000    0000 0101

//按位与
System.out.println("按位与操作----i(7)&j(5)=?--------------------------");
System.out.println("//0000 0000   0000 0000    0000 0000    0000 0111\n"+
"//&\n"+
"//0000 0000   0000 0000    0000 0000    0000 0101\n"+
" = \n"+
"//0000 0000   0000 0000    0000 0000    0000 0101 = 5"
);
System.out.println("按位与操作结果:"+(i&j));

System.out.println("按位与操作----m(-7)&n(-5)?--------------------------");
System.out.println("//1000 0000   0000 0000    0000 0000    0000 0111\n"+
"//&\n"+
"//1000 0000   0000 0000    0000 0000    0000 0101\n"+
"//补码:\n"+
"//1111 1111   1111 1111    1111 1111    1111 1001\n"+
"//&\n"+
"//1111 1111   1111 1111    1111 1111    1111 1011\n"+
" = \n"+
"//1111 1111   1111 1111    1111 1111    1111 1001(补码)\n"+
"//1000 0000   0000 0000    0000 0000    0000 0111 = -7(原码)"
);
System.out.println("按位与操作结果:"+(m&n));
System.out.println("*****************************************************************************\n");


运算结果:

按位与操作----i(7)&j(5)=?--------------------------
//0000 0000   0000 0000    0000 0000    0000 0111
//&
//0000 0000   0000 0000    0000 0000    0000 0101
=
//0000 0000   0000 0000    0000 0000    0000 0101 = 5
按位与操作结果:5
按位与操作----m(-7)&n(-5)?--------------------------
//1000 0000   0000 0000    0000 0000    0000 0111
//&
//1000 0000   0000 0000    0000 0000    0000 0101
//补码:
//1111 1111   1111 1111    1111 1111    1111 1001
//&
//1111 1111   1111 1111    1111 1111    1111 1011
=
//1111 1111   1111 1111    1111 1111    1111 1001(补码)
//1000 0000   0000 0000    0000 0000    0000 0111 = -7(原码)
按位与操作结果:-7
*****************************************************************************

二、按位或

运算规则:0|1=1,0|0=0,1|0 = 1,1|1=1

用途:给位置1.

//按位或
System.out.println("按位或操作----i(7)|j(5)=?--------------------------");
System.out.println("//0000 0000   0000 0000    0000 0000    0000 0111\n"+
"//|\n"+
"//0000 0000   0000 0000    0000 0000    0000 0101\n"+
" = \n"+
"//0000 0000   0000 0000    0000 0000    0000 0111 = 7"
);
System.out.println("按位或操作结果:"+(i|j));

System.out.println("按位或操作----m(-7)|n(-5)?--------------------------");
System.out.println("//1000 0000   0000 0000    0000 0000    0000 0111\n"+
"//|\n"+
"//1000 0000   0000 0000    0000 0000    0000 0101\n"+
"//补码:\n"+
"//1111 1111   1111 1111    1111 1111    1111 1001\n"+
"//|\n"+
"//1111 1111   1111 1111    1111 1111    1111 1011\n"+
" = \n"+
"//1111 1111   1111 1111    1111 1111    1111 1011(补码)\n"+
"//1000 0000   0000 0000    0000 0000    0000 0101 = -5(原码)"
);
System.out.println("按位或操作结果:"+(m|n));
System.out.println("*****************************************************************************\n");


运算结果:

按位或操作----i(7)|j(5)=?--------------------------
//0000 0000   0000 0000    0000 0000    0000 0111
//|
//0000 0000   0000 0000    0000 0000    0000 0101
=
//0000 0000   0000 0000    0000 0000    0000 0111 = 7
按位或操作结果:7
按位或操作----m(-7)|n(-5)?--------------------------
//1000 0000   0000 0000    0000 0000    0000 0111
//|
//1000 0000   0000 0000    0000 0000    0000 0101
//补码:
//1111 1111   1111 1111    1111 1111    1111 1001
//|
//1111 1111   1111 1111    1111 1111    1111 1011
=
//1111 1111   1111 1111    1111 1111    1111 1011(补码)
//1000 0000   0000 0000    0000 0000    0000 0101 = -5(原码)
按位或操作结果:-5
*****************************************************************************

三、按位异或

运算规则:0&0=0,0&1=1,1&0=1,1&1=0

用途:特定位反转,两数交换

//按位异或
System.out.println("按位异或操作----i(7)^j(5)=?--------------------------");
System.out.println("//0000 0000   0000 0000    0000 0000    0000 0111\n"+
"//|\n"+
"//0000 0000   0000 0000    0000 0000    0000 0101\n"+
" = \n"+
"//0000 0000   0000 0000    0000 0000    0000 0010 = 2"
);
System.out.println("按位异或操作结果:"+(i^j));

System.out.println("按位异或操作----m(-7)^n(-5)?--------------------------");
System.out.println("//1000 0000   0000 0000    0000 0000    0000 0111\n"+
"//^\n"+
"//1000 0000   0000 0000    0000 0000    0000 0101\n"+
"//补码:\n"+
"//1111 1111   1111 1111    1111 1111    1111 1001\n"+
"//^\n"+
"//1111 1111   1111 1111    1111 1111    1111 1011\n"+
" = \n"+
"//0000 0000   0000 0000    0000 0000    0000 0010(补码)\n"+
"//0000 0000   0000 0000    0000 0000    0000 0010 = 2(原码)"
);
System.out.println("按位异或操作结果:"+(m^n));

System.out.println("按位操作可以进行两个数值的交换");
int a = m;
int b = n;
System.out.println("a,b的初始值:a="+a+",b="+b);
a=a^b;
b=a^b;
a=a^b;
System.out.println("a,b的操作值:a="+a+",b="+b);
System.out.println("*****************************************************************************\n");


运行结果:

按位异或操作----i(7)^j(5)=?--------------------------
//0000 0000   0000 0000    0000 0000    0000 0111
//|
//0000 0000   0000 0000    0000 0000    0000 0101
=
//0000 0000   0000 0000    0000 0000    0000 0010 = 2
按位异或操作结果:2
按位异或操作----m(-7)^n(-5)?--------------------------
//1000 0000   0000 0000    0000 0000    0000 0111
//^
//1000 0000   0000 0000    0000 0000    0000 0101
//补码:
//1111 1111   1111 1111    1111 1111    1111 1001
//^
//1111 1111   1111 1111    1111 1111    1111 1011
=
//0000 0000   0000 0000    0000 0000    0000 0010(补码)
//0000 0000   0000 0000    0000 0000    0000 0010 = 2(原码)
按位异或操作结果:2
按位操作可以进行两个数值的交换
a,b的初始值:a=-7,b=-5
a,b的操作值:a=-5,b=-7
*****************************************************************************

四、按位取反

运算规则:~0=1,~1=0;
用途:移除标志位。
//按位取反
System.out.println("按位取反操作----~i=?--------------------------");
System.out.println("//~\n"+
"//0000 0000   0000 0000    0000 0000    0000 0111\n"+
" = \n"+
"//1111 1111   1111 1111    1111 1111    1111 1000(补码)\n"+
"//1000 0000   0000 0000    0000 0000    0000 1000 = -8(原码)"
);
System.out.println("按位取反操作结果:"+(~i));

System.out.println("按位取反操作----~m?--------------------------");
System.out.println("//1000 0000   0000 0000    0000 0000    0000 0111\n"+
"//补码:\n"+
"//1111 1111   1111 1111    1111 1111    1111 1001\n"+
"//~\n"+
"//1111 1111   1111 1111    1111 1111    1111 1001\n"+
" = \n"+
"//0000 0000   0000 0000    0000 0000    0000 0110\n(补码)\n"+
"//0000 0000   0000 0000    0000 0000    0000 0110 = 6(原码)"
);
System.out.println("按位取反操作结果:"+(~m));
System.out.println("正数i的取反等于(-i-1)");


运行结果:
按位取反操作----~i=?--------------------------
//~
//0000 0000   0000 0000    0000 0000    0000 0111
=
//1111 1111   1111 1111    1111 1111    1111 1000(补码)
//1000 0000   0000 0000    0000 0000    0000 1000 = -8(原码)
按位取反操作结果:-8
按位取反操作----~m?--------------------------
//1000 0000   0000 0000    0000 0000    0000 0111
//补码:
//1111 1111   1111 1111    1111 1111    1111 1001
//~
//1111 1111   1111 1111    1111 1111    1111 1001
=
//0000 0000   0000 0000    0000 0000    0000 0110
(补码)
//0000 0000   0000 0000    0000 0000    0000 0110 = 6(原码)
按位取反操作结果:6
正数i的取反等于(-i-1)

按位取反,可以配合&和|,进行状态的增加和移除。http://blog.csdn.net/hailushijie/article/details/8675820

五、掩码:

掩码0x00ff
用途:
1、取出某些位。

例如:取出低八位

int a = 0x1234;
int b = (a& 0x00ff);


2、特定位置0。

b = a & ~0x00ff;


3、特定为置1。

b = a|0x00ff;

六、异或性质:

1、任何数和自己异或结果为零。
2、任何数和0做异或值不变,和1异或结果为原操作数取反。
3、位运算a1^a2^...a^n = 1,那么a1.. .. an中1的个数为奇数。
4、x^x^y = y。 验证:由于x^x = 0,0 ^y = y,故上式成立。应用请参照上文按位异或中两数交换的例子
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息