注:蓝色字均为资料外链,建议阅读
-
原码为signBit+数值位
对应补码 正数不变
负数的补码符号位不变,其后1变为零直到最后一个1. 反码加一码
特殊情况:负零的原码、反码,定义为负的最大值的补码(补码比原码和反码多表示一个数 )。
按位运算先化为补码,最后手算输出时化为原码(先-1(第33位默认可借1)再作反码,若为-2e31则化不为原码),实际计算机不作变换,全用补码。public class demo{ public static void main(String [] args){ int a = (int)-2e31,b=-2; //a 的补码表示为1000 0000 0000 0000 0000 0000 0000 0000 //b 的补码表示为1111 1111 1111 1111 1111 1111 1111 1110 // 数值的加减操作对应码的数值位的加减操作 比如-1 = -2 + 1; // -1 的补码就是b的补码加一 System.out.println(a|0);//不会做补码到原码的转换其实,因为对于计算机补码表示的范围大 //只要是在范围内的数学运算就是合理的,合理不合理,只是针对人类理解 System.out.println(a-1);//溢出变为正的最大值。应该由程序员避免。 //符号位照样参与了运算。 System.out.println(b+b);//-4 合理 补码:1111 1111 1111 1111 1111 1111 1111 1100 //反码 == 补码减一 1111 1111 1111 1111 1111 1111 1111 1011 //原码(为了自己能看懂) == 1000 0000 0000 0000 0000 0000 0000 0100 //计算机实际不做这种转换! //hsp讲的不太清楚。 System.out.println(0-1);//-1 合理 补码:1111 1111 1111 1111 1111 1111 1111 1111 //默认了第33位可借,所有都参与运算。 } }
-
算数移位:
算术右移:a >> b ⇔ a ÷ 2b
算术左移:a << b ⇔ a × 2b
逻辑右移运算符: a >>> b ⇔ a补码向右溢出b个bit,高位补零。
无逻辑左移 -
a % b ⇔ aabb (a - (int)a / b * b)
eg. -10.5 % 3 = -10.5 - (int)(-10.5) / 3 * 3 = -10.5 - (-9) = -1.5数学上:
对于整数 a,b 来说,取模运算mod(a , b)或者求余运算rem(a , b)的方法要分如下两步:
1、求整数商
:c=a/b
2、计算模或者余数:r=a-(c*b)
实际可写为一步aabb 即 a - func(a/b) * b
func可为fix() 或floor() matlab函数参考。
取余和取模的区别余零前
求模运算和求余运算在第一步
不同
取余运算在计算商值向0方向舍弃小数位
取模运算在计算商值向负无穷方向舍弃小数位经过测试,在C/C++, C#, JAVA,PHP这几门主流语言中,’%’运算符都是做取余运算,而在python中的’%’是做取模运算。
step 1. -10.5 / 3 = - 3.5 若取余运算则
整数商
为-3(余靠近零) 若取模则为-4
step 2. -10.5 - (-3 * 3) = -1.5 (rem结果 (口诀余商近零、异符同前(钱) 同符为正))
-10.5 - (-4 * 3) = 1.5 (mod结果 (口诀模商近地、异符同后
))只有python的%模才是模,别的都是
余商近零、(后四字检查用)异符同前
。余商近零、模商远零