【问题标题】:largest value in two complements representation两个补码表示中的最大值
【发布时间】:2021-05-28 00:09:43
【问题描述】:

两个补码表示法中以下哪一个表示最大值?

a. 00000010
b. 11111111
c. 00000001
d. 11111110

我发现答案是 A.,即 00000010如何

【问题讨论】:

    标签: algorithm binary


    【解决方案1】:

    所以你有 有符号字节 来比较;这些值在[-128..127] 范围内。现在让我们检查一下:

    a. 00000010 ==  10 (binary) ==  2 <- the largest value (among -2, -1, 1, 2)
    b. 11111111 ==  -1 (binary) == -1
    c. 00000001 ==   1 (binary) ==  1
    d. 11111110 == -10 (binary) == -2
    

    注意,如果二进制表示从1 开始,则值为。 您可以通过2 complement获得这些负数绝对值

    x => ~x + 1
    

    ~ 代表 bitwise not+ 1 像往常一样添加1

    例如:

    11111111 => 00000000 + 1 == 00000001 == 1 (and we have -1)
    11111110 => 00000001 + 1 == 00000010 == 2 (and we have -2)
    

    编辑:让我们 implement 一个简单的例程 (C#) 用于一般情况(注意,前导零强制):

      private static string SignedIntegerValue(string value) {
        if (value.StartsWith('0'))
          return value;
    
        StringBuilder sb = new StringBuilder(value.Length + 1);
        sb.Append('-');
        sb.Append(value);
    
        int shift = 1;
    
        for (int i = sb.Length - 1; i >= 1; --i) {
          int v = (1 - sb[i] + '0') + shift;
    
          sb[i] = (char)('0' + (v % 2));
          shift = v / 2;
        }
    
        return sb.ToString();
      }
    

    演示:

      string[] values = new string[] {
        "00000010",
        "11111111",
        "00000001",
        "11111110",
      };
    
      string report = string.Join(Environment.NewLine, values
        .Select(x => $"{x} => {SignedIntegerValue(x).PadLeft(x.Length + 1)}"));
    
      Console.Write(report);
    

    结果:

      00000010 =>  00000010
      11111111 => -00000001
      00000001 =>  00000001
      11111110 => -00000010
    

    【讨论】:

      猜你喜欢
      • 2015-03-22
      • 2011-12-14
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 2012-04-18
      • 2013-03-06
      • 2018-02-25
      • 2020-05-31
      相关资源
      最近更新 更多