位运算符
2019-11-02 本文已影响0人
lj72808up
1. 负数的表示
负数表示为: 对应的正数, 先取反, 再加1
-1的表示:
1. 1表示为: 0000 0000 0000 0000 0000 0000 0000 0001
2. 各位取反: 1111 1111 1111 1111 1111 1111 1111 1110
3. 取反+1: 1111 1111 1111 1111 1111 1111 1111 1111
int a = -1;
int b = 0xffffffff;
System.out.println(b); // -1
2. 带符号左移/右移 (<<
和>>
), 无符号右移(>>>
)
- 左移: 只有
<<
, 无论正数还是负数, 低位都补0 - 右移:
- 对于负数, 有符号右移
>>
补1; - 对于正数, 有符号右移
>>
补0; - 无符号右移
>>>
, 无论正数或负数, 都补0
- 对于负数, 有符号右移
int c = -1; // 1111 1111 1111 1111 1111 1111 1111 1111
System.out.println( c<<1 ); // -2
System.out.println( 0xfffffffe ); // -2 (1111 1111 1111 1111 1111 1111 1111 1110)
System.out.println( c>>1 ); // -1 "1111 1111 1111 1111 1111 1111 1111 1111"高位补1
System.out.println( c>>>1 ); //2147483647 "0111 1111 1111 1111 1111 1111 1111 1111"高位补0
System.out.println(0x7fffffff);//2147483647
3. 诸位取反~
int a = 1; // 0000 0000 0000 0000 0000 0000 0000 0001
System.out.println(~a); // 所有位取反: "1111 1111 1111 1111 1111 1111 1111 1110", -2
System.out.println(0xfffffffe);
3. 异或^
- 法则:
- 诸位相比, 相同得0, 不同得1;
- 0异或任何数 = 任何数
- 由此推断出: 数a两次异或同一个数b(a=abb)仍然为原值a.
- 任何数异或自己 = 0
- 由上面两条推断出:
1^0=1
,1^1=0
- 由上面两条推断出:
- 0异或任何数 = 任何数
- 因此,
^
可类比于诸位的无进位加法
1^1 = 0 , 1^0 = 0 , 0^0=0
- 异或的运用
-
实现将一个数的某一位翻转: 比如让数a的第n位翻转, 可以用
a^(1<<n-1)
int a = 0x73; // 0111 0011 //将a的第3位翻转 int b = a^(1<<2); System.out.println(b); //119 int a1 = 0x77 ; // 0111 0111 System.out.println(a1); //119
- 交换2个数
int a = 0x73; // 0111 0011 int b = 0x70; // 0111 0000 System.out.println(a); // 115 System.out.println(b); // 112 a = a^b; b = b^a; a = a^b; System.out.println(a); // 112 System.out.println(b); // 115
- 汇编语言中, 通常使用
异或
将一个数置0
XOR a a
- 快速判断两个数是否相等
return (a^b)==0
-
实现将一个数的某一位翻转: 比如让数a的第n位翻转, 可以用