在c#入门经典一书中,最为糟糕的一节就是位移了,完全没有讲明白,也没有说全,似乎只是轻轻点了一下何为位移,带了两次原码和补码,完全不理会是否明白不明白。这一点这本书很差。因为此书说了,在大多数应用开发中,除了数学应用,这个功能不是很好常用。
先说一下,何为“位移”,位移是对操作数的二进制进行操作。
也就是说,操作数的位移过程中是2进制,但是最后结果是操作数的类型而已。
再说何为 原码,补码。
原码:数字的二进制
补码,计算机系统中数值的存储方式,二进制的特殊计算方式。计算过程:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外,末尾+1,按照二进制计算方式计算
反码:计算机系统中数值的存储方式,二进制的特殊计算方式。计算过程:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
原码和补码,反码是存在关系的,三者之间是可以互相转换。
原码变补码,原码变反码
正数:正数的原码和补码,反码是一样。
9的二进制:1001 原码0000 1001 补码0000 1001,反码0000 1001
负数 :
原码:就是二进制,最高位位1。
补码:过程最高位1表示符号,其他位按位取反,1变成0,0变成1。最后整个数加1.
反码:除了最高位表述符号,1位负数【-】,0为正数【+】,之外每一位按位取反,1变成0,0变成1
-9 原码1000 1001,补码1111 0111, 反码1111 0110
补码的过程:先是最高位表示符号【1是负数,0是正数】,其他位按位取反,1变成0,0变成1也就是: 1111 0110,之后整个数字+1,1111 0110+1=1111 0111就ok了
反码的过程:先是最高位表示符号【1是负数,0是正数】,其他位按位取反,1变成0,0变成1也就是: 1111 0110 也就ok了,【补码和反码之间的关系是,反码的末尾+1】
补码,反码求原码
正数:
正数的原码,补码,反码是一样的,一样的!
2:原码0000 0010,反码:0000 0010,补码0000 0010
负数:
补码求原码:除了最高位表示符号不变之外,其他位按位取反,1变0,0变1,最后+1【按二进制计算方法计算】
反码求原码:除了最高位表示符号不变之外,其他位按位取反
-2 补码 1111 1110 反码1111 1101 原码1000 0010
原文:http://www.cnblogs.com/T-ARF/p/6362479.html