一、补码
数字在计算机内部通常是以“二进制补码”的形式表示的
正数的补码跟原码一样。
负数则要复杂的多,它要逐位取反再加1。假设用8位二进制表示一个数字,最高位是符号位。
补码的补码就是原码。可以证明如下:(zt)
设原码为a,a的补码为b,b的补码为c
则b = ~a + 1;
c = ~b + 1 = ~(~a + 1) + 1 = a + ~(1) + 1 = a
负数的原码和补码间的转换:
最高位不动,其他位取反+1。注:此种转换方式等价于:负数的绝对值的原码每位都取反加1
二、位运算
1.在java、c++、c、javascript和c#五种语言中都有位运算
2.位运算比整除和求余运算速度都快,可用来优化这两种操作
3.操作符为&,|,^,>>,<<,在java中还有一个>>>
4. &,|和 &&,||的主要区别为:
前者是整形变量和整形变量操作,结果为整形变量
后者是布尔型和布尔型,结果为布尔型
5.如果为非负数,>>相当于除以2,<<相当于乘以2
如果为负数,比较复杂,在java中,>>是符号位扩展,也就是补1,而>>>全补0
6.<<操作有可能改变符号