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

转载请注明出处: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,故上式成立。应用请参照上文按位异或中两数交换的例子


  • 7
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hailushijie

您的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值