1.<<表示二进制下位数左移,不分正负数,低位补0
用byte数据类型来举例:10<<2,表示向左移动两位,实际上就是n<<x n=n*2^x,也就是 10 * 2^2 = 40
正数:比如说10的二进制码为:00001010
左移两位后:00101000,结果为40
注意:
反码:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
补码:正数的补码与其原码相同;负数的补码是在其反码的末位加1。
负数:比如说-10的二进制码为:10001010
因为是负数,先进行反码:11110101
补码(加一):11110110
左移两位后的补码为:11011000
减1:11010111
反码:10101000,结果为-40
2.>>右移同理,负数的话高位补1,正数高位补0
正数: 10的原码:00000101
右移两位:00000010
结果2
负数:-10的原码:10001010
先进行反码: 11110101
补码: 11110110
右移两位: 11111101
减1: 11111100
反码:10000011
结果-3
3.>>>表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0
正数时:跟>>一样
负数时:
-20源码:10000000 00000000 00000000 00010100
反码:11111111 11111111 11111111 11101011
补码:11111111 11111111 11111111 11101100
右移:00111111 11111111 11111111 11111011
结果:r = 1073741819
汉明距离:
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。给出两个整数 x 和 y,计算它们之间的汉明距离。 注意:0 ≤ x, y < 2^31
//解题思路:
//1的二进制是00000001
//2的二进制是00000010
//4的二进制是00000100
//&的运算是一样返回1,不一样返回0,不断的将1的位置向前移动,
//可以判断对比值x,y的位上是否是1,如果都是1则返回1,一个是1一个是0则返回0....
class Solution {
public int hammingDistance(int x, int y) {
int res = 0;
int p = 1;
for (int i = 0; i < 32; i++) {
if ((x & p) != (y & p)) {
res++;
}
p *= 2;
}
return res;
}
}
1.与运算符"&"
与运算符用符号“&”表示:两个操作数中位都为1,结果才为1,否则结果为0。
2.或运算符"|"
或运算符用符号“|”表示:两个操作中位有一个是1,结果为1,都为0,才取0。
3.非运算符“~”
非运算符用符号“~“表示:如果位为1,结果是0,如果位是0,结果是1。
~计算之后,如果得到的结果为负数,因为高位为“1”,要对其进行补码,负数的补码是将它绝对值的原码取反,末尾在加1。比如说8转成2进制是
原码为:00000000 00000000 00000000 00001000
在~后: 11111111 11111111 11111111 11110111
绝对值:00000000 00000000 00000000 00001000
再加一:00000000 00000000 00000000 00001001
然后加上一个负号,也就是~8 = -9
4.异或运算符
异或运算符是用符号“^”表示的,其运算规律是:两个操作数的位中,相同则结果为0,不同则结果为1。
image










网友评论