一、取反
~101010=010101
二、原码
符号位(第一位):用0表示正数,用1表示负数
注意:
- 正数的原码 就是它在计算机中的表示。如12的原码和二进制表示
- 负数的原码和它在计算机中的表示不一样。负数的原码是对应的正数符号位取反,而负数在计算机中的表示是负数的补码。
三、补码
- 负数:对负数的原码来说,符号位不变,其他位取反加1
例子:-12的补码
①-12对应正数12(0000 1100)→所有位取反(1111 0011)→+1(1111 0100)
②-12对应的负数-12的原码(1000 1100)→符号位不变,其他位取反(1111 0011)→+1(1111 0100)
- 正数的补码是本身
计算负数时用到:
11-12
=11+(-12)
=0000 1011+1111 0100(补码化)
=1111 1111(竖式计算)
=-1(补码化原码:减1,符号位不变,其他位取反)
四、带符号数据
带符号数据:1000 1010=-10
不带符号数据:1000 1010=138
五、位运算符
Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。
位运算符,是按照二进制格式来运算。
假设a = 60,b = 13;它们的二进制格式表示将如下:
A = 0011 1100
B = 0000 1101
操作符 | 描述 | 例子 |
与运算符(&) | 如果相对应位都是1,则结果为1,否则为0 | (A&B)得到12,即0000 1100 |
或运算符(|) | 如果相对应位都是0,则结果为0,否则为1 | (A | B)得到61,即 0011 1101 |
异或运算符(^) | 如果相对应位值相同,则结果为0,否则为1(异或,异才为1) | (A ^ B)得到49,即 0011 0001 |
非与运算符(~) /按位取反运算符 | 翻转操作数的每一位,即0变成1,1变成0。 | (〜A)得到-61,即1100 0011 |
左移运算符(<<) /按位左移运算符 | 左操作数按位左移右操作数指定的位数。低位补零 x<<y相当于x*2^y(x乘以2的y次方) | A << 2得到240,即 1111 0000 |
有符号右移运算符(>>) (按位右移运算符) (算术右移运算符) | 左操作数按位右移右操作数指定的位数。低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。 x<<y相当于x/2^y(x除以2的y次方) | A >> 2得到15即 0000 1111 |
无符号右移运算符(>>>) (按位右移补零操作符) (逻辑右移运算符) | 左操作数的值按右操作数指定的位数右移。低位移出(舍弃),高位的空位都补零。对于正数来说和带符号右移相同,对于负数来说不同,移动得到的空位以零填充。 |
|
//有符号右移运算符(>>)与无符号右移运算符(>>>)的代码:
System.out.println(Integer.toBinaryString(4>>2));
System.out.println(Integer.toBinaryString(-4>>2));
//1
//11111111111111111111111111111111
System.out.println(Integer.toBinaryString(4>>>2));
System.out.println(Integer.toBinaryString(-4>>>2));
//1
//111111111111111111111111111111
PS:移位运算符的右操作数要完成模 32 的运算(除非左操作数是 long 类型, 在这种情
况下需要对右操作數模 64 )。例如, 1 «35 的值等同于 1 «3 或 8。