运算符号
编辑
下面的a和b都是整数类型,则:
含义 | Pascal语言 | C语言 | C#语言 | Java |
---|---|---|---|---|
按位与 | a and b | a & b | a & b | a & b |
按位或 | a or b | a | b | a | b | a | b |
按位异或 | a xor b | a ^ b | a ^ b | a ^ b |
按位取反 | not a | ~a | ~a | ~a |
左移 | a shl b | a << b | a << b | a << b |
带符号右移 | a shr b | a >> b | a >> b | a >> b |
无符号右移 | a>>> b |
运算说明
编辑
=== 1. and运算 & ===
一个数 and 1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数。
=== 2. or运算 | ===
一个数or 1的结果就是把二进制最末位强行变成1。如果需要把二进制最末位变成0,对这个数or 1之后再减一就可以了,其实际意义就是把这个数强行变成最接近的偶数。
=== 3. xor运算 ^ ===
xor运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a xor b) xor b = a。
a ^ b % p = ((a % p)^b) % p
=== 4. not运算 ~ ===
not运算的定义是把内存中的0和1全部取反。使用not运算时要格外小心,你需要注意整数类型有没有符号。如果not的对象是无符号整数(不能表示负数),那么得到的值就是它与该类型上界的差
=== 5. shl运算 << ===
a shl b就表示把a转为二进制后左移b位(在后面添b个0)。例如100的二进制为1100100,而110010000转成十进制是400,那么100 shl 2 = 400。可以看出,a shl b的值实际上就是a乘以2的b次方,因为在二进制数后添一个0就相当于该数乘以2。
=== 6. shr运算 >> ===
和shl相似,a shr b表示二进制右移b位(去掉末b位),相当于a除以2的b次方(取整)。我们也经常用shr 1来代替div 2,比如二分查找、堆的插入操作等等。