// 左移运 << 左移位,在低位处补0
// 5 = 0000 0101 移动两位
// = 0001 0100 = 20
// "<<" 左移:右边空出的位上补0,左边的位将从字头挤掉,其值相当于乘2。
// 右移位 >> ,若为正数则高位补0,若为负数则高位补1
// 5 = 0000 0101 移动两位
// = 0000 0001 = 0
// -5 = 1111 1111 1111 1111 1111 1111 1111 1011
// 1111 1111 1111 1111 1111 1111 1111 1110
//
//无符号右移位 >>> ,无论正负都在高位补0
// 1111 1111 1111 1111 1111 1111 1111 1011
// 0111 1111 1111 1111 1111 1111 1111 1110
// byte b = 127 = 0111 1111
// b << 3 = 11 1111 1000 = 1016 (转换成int)
// (byte)(b << 3) = 1111 1000 = -8
// 5<<35 这个结果将是什么呢?
// 如果移位操作数超出了该位数则取模计算 ==> 5 << 35 == 5 << (35 % 32) ==> 5 << 3 = 40
// & 与(AND) [真真为真,其余为假],对两个整型操作数中对应位执行布尔代数,两个位都为1时输出1,否则0。
// 5 & 3
// 0000 0000 0000 0000 0000 0000 0000 0101
// & 0000 0000 0000 0000 0000 0000 0000 0011
// = 0000 0000 0000 0000 0000 0000 0000 0001
// 1、清零特定位 (mask中特定位置0,其它位为1,s=s&mask)
// 清零第三位 0000 0101 & 1111 1011 ==> 0000 0001
// 2 取某数中指定位 (mask中特定位置1,其它位为0,s=s&mask)
// 0000 0101 & 0000 0100 ==> 0000 0100
//
// 0&0=0,0&1=0 0与任何数 = 0
// 1&0=0,1&1=1 1与任何数 = 任何数
// 任何数异或自己=自己
// | 或(OR) [假假为假,其余全真] 对两个整型操作数中对应位执行布尔代数,两个位都为0时输出0,否则1。
// 5 & 3
// 0000 0000 0000 0000 0000 0000 0000 0101
// | 0000 0000 0000 0000 0000 0000 0000 0011
// = 0000 0000 0000 0000 0000 0000 0000 0111
// ~ 非(NOT) [真则假,假则真] 一元运算符。
// ~5
// 0000 0000 0000 0000 0000 0000 0000 0101
// ~ 1111 1111 1111 1111 1111 1111 1111 1010
// ^ 异或(XOR) [相同为假,不同为真] 对两个整型操作数中对应位执行布尔代数,两个位相等0,不等1
// 5 ^ 3
// 0000 0000 0000 0000 0000 0000 0000 0101
// ^ 0000 0000 0000 0000 0000 0000 0000 0011
// = 0000 0000 0000 0000 0000 0000 0000 0110
经验分享
- 按位异或可以不使用临时变量完成两个值的交换,也可以使某个整型数的特定位的值翻转。
- 按位与运算可以用来屏蔽特定的位,也可以用来取某个数型数中某些特定的位。
- 按位或运算可以用来对某个整型数的特定位的值置l。
异或
参与运算的两个值,如果两个相应位相同,则结果为0,否则为1。即:0^0=0, 1^0=1, 0^1=1, 1^1=0
例如:10100001^00010001=10110000
- 00=0,01=1 0异或任何数=任何数
- 10=1,11=0 1异或任何数-任何数取反
- 任何数异或自己=把自己置0
(1)按位异或可以用来使某些特定的位翻转,如对数10100001的第2位和第3位翻转,可以将数与00000110进行按位异或运算。
10100001^00000110=10100111 //1010 0001 ^ 0x06 = 1010 0001 ^ 6
(2)通过按位异或运算,可以实现两个值的交换,而不必使用临时变量。例如交换两个整数a,b的值,可通过下列语句实现:
a=10100001,b=00000110
a=a^b; //a=10100111
b=b^a; //b=10100001
a=a^b; //a=00000110
(3)异或运算符的特点是:数a两次异或同一个数b(a=abb)仍然为原值a.