none
按位补码的问题 RRS feed

  • 问题

  • 每次学习的时候看到书上的有些示例用到取反或者按位运算符,补码 之类的东西 这些东西在书上讲解的时候都是用二进制的01来讲解的 不知道你们在编程的时候遇到比喻说取反的时候是不是都转换成二进制计算完毕之后再转换回来? 这样岂不是很麻烦? 还是做这样的运算本来就是这样麻烦?

    例如:
    int i = -3;
    i = ~i;
    Console::WriteLine(i);

    这样!那么你不能转换成二进制 能有什么方式计算呢? 我觉得好郁闷 一直学下来 有时候就是遇到这样的东西 我都没有搞懂 希望哪位兄台详细点教我一下 谢谢
    法拉利 法拉利 法拉利
    2009年6月19日 13:41

答案

  • 呵呵,这个东西确实有点麻烦。在我开发时很少把它转换成2进制再取反,而是以十六进制直接取反。要想成为一个熟练的程序员,二进制和十六进制的转换必须要非常熟悉的。比如0xF取反就是0x0, 0xE取反就是0x1,4位就是0xF - 要取反的数 = 取反后的数,一个32位数的取反就等于0xFFFFFFFF 减去 这个数 = 取反后的数。
    4位的二进制数和16进制数的转换是要直接背下来的,这样会快很多。
    0xBAADF00D
    2009年6月20日 3:19
    版主

全部回复

  • 不太明白你要问什么?~是按位取反,而不是补码。
    -3首位是符号位
    那么首先就是1000 0000 0000 0000 0000 0000 0000 0011
    然后符号为以外取补码
    1111 1111 1111 1111 1111 1111 1111 1100(反码)
    1111 1111 1111 1111 1111 1111 1111 1101(补码)
    这是-3的内存结构
    然后按位取反
    0000  0000 0000 0000 0000 0000 0000 0010
    那么结果就是2
    另外位操作通常是为了提高运算速度,或节省内存空间,在或者实现某些算法而用。
    比如说除2 就可以用n>>1来代替
    n^1则代表其他位不变而低位取反。
    再比如n^m
    如果m是一个密钥,你可以对n进行一个简单的加密过程等等。


    麻烦把正确答案设为解答。
    2009年6月20日 0:26
    版主
  • 呵呵,这个东西确实有点麻烦。在我开发时很少把它转换成2进制再取反,而是以十六进制直接取反。要想成为一个熟练的程序员,二进制和十六进制的转换必须要非常熟悉的。比如0xF取反就是0x0, 0xE取反就是0x1,4位就是0xF - 要取反的数 = 取反后的数,一个32位数的取反就等于0xFFFFFFFF 减去 这个数 = 取反后的数。
    4位的二进制数和16进制数的转换是要直接背下来的,这样会快很多。
    0xBAADF00D
    2009年6月20日 3:19
    版主
  • 呵呵,这个东西确实有点麻烦。在我开发时很少把它转换成2进制再取反,而是以十六进制直接取反。要想成为一个熟练的程序员,二进制和十六进制的转换必须要非常熟悉的。比如0xF取反就是0x0, 0xE取反就是0x1,4位就是0xF - 要取反的数 = 取反后的数,一个32位数的取反就等于0xFFFFFFFF 减去 这个数 = 取反后的数。
    4位的二进制数和16进制数的转换是要直接背下来的,这样会快很多。
    0xBAADF00D

    Vonger 能给你的MSN或者QQ给我吗? 这样上来问 好蛮烦啊

    这个问题就算了 等我有需要的时候再上来问你们好了
    法拉利 法拉利 法拉利
    2009年6月20日 5:01