【问题标题】:javascript, my two's complement is not producing the right numberjavascript,我的二进制补码没有产生正确的数字
【发布时间】:2014-10-09 22:46:34
【问题描述】:

我正在为我的计算机科学课编写一个基本计算器,它接收 0-255 之间的数字并将其转换为二进制、一个补码和二进制补码。我和另一名学生一直在一起研究这个问题,我们都被困在二进制补码上,它产生了错误的值。例如,如果我们输入 11,则二进制补码应该是“1111 1011”,但我得到的是“1111 0101”,我不确定是什么问题?

我已经在 jsbin.com 开始了一个演示,我希望这里的某个人能够真正挽救我的生命(和我的成绩),并告诉我我和我的编码伙伴做错了什么。

jsbin -> http://jsbin.com/juqevomiliwo/1/edit

另外,我真的很想添加一些错误检查,例如用户输入负数或用户输入的值不在 0-255 的值范围内,是否有人也可以帮助我?我真的很想有一个弹出窗口说,“对不起,您需要输入一个介于 0-255 之间的值”

我很抱歉问了这么多,但我不知道还能去哪里!我已经多次使用 stackoverflow 来帮助我解决问题,这是我第一次发布我不知道如何解决的问题!

非常感谢大家的宝贵时间和帮助!

-马丁

代码如下:

<!DOCTYPE html>

<html>
<head>
    <title>Group Project</title>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
    <h1>Group Project 1</h1>
    <p>Enter a number between 0 and 255 <input id="theInput" type="text" /> <button onclick="doSomething()">Show Binary</button>   </p>
    <p>Unsigned Binary: <span id="binaryOutput"></span></p>
    <p>One's Complement: <span id="onesOutput"></span></p>
    <p>Two's Complement: <span id="twosOutput"></span></p>
    <script>
        function doSomething(){
            var i = document.getElementById('theInput').value; //gets number from input box and sets it to i
            var binary = pad(Number(i).toString(2), 8); //converts i to binary and pads with leading zeros until 8 digits long
            var ones = binary.toString(2).replace(/1/g, 'a').replace(/0/g, '1').replace(/a/g, '0');
            var twos = pad((Number(ones) + 1), 8);

            document.getElementById('binaryOutput').innerHTML = fancy(binary); //puts the binary in the Unsigned Binary field
            document.getElementById('onesOutput').innerHTML = fancy(ones); //puts the ones compliment in the One's Complement field
            document.getElementById('twosOutput').innerHTML = fancy(twos); //puts the twos compliment in the Two's Complement field
        }

        //adds leading zeros to achieve width
        function pad(n, width, z) {
            z = z || '0';
            n = n + '';
            return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
        }

        //adds space every four digits
        function fancy(b) {
            return b.replace( /\d{4}/g, '$& ' ).replace( /\s$/,'');
        }

    </script>
</body>

【问题讨论】:

  • 鉴于您当前的代码,我不知道为什么您需要帮助检查数字是否在 0-255 之间。
  • 我只是想尝试解决可能出现的任何问题,我觉得程序中应该有一些错误检查,比如 if n 255 then do一个弹出窗口告诉用户请输入正确的值。
  • 我认为这是一项学校作业。 :-)

标签: javascript css


【解决方案1】:

在您的twos = pad((Number(ones) + 1), 8); 行中,Number() 函数不会将二进制字符串转换为数字(它假定字符串是十进制的)。

您应该改用twos = pad((parseInt(ones, 2) + 1).toString(2), 8);。请参阅下面的 sn-p。

function doSomething(){
            var i = document.getElementById('theInput').value; //gets number from input box and sets it to i
            var binary = pad(Number(i).toString(2), 8); //converts i to binary and pads with leading zeros until 8 digits long
            var ones = binary.replace(/1/g, 'a').replace(/0/g, '1').replace(/a/g, '0');
            var twos = pad((parseInt(ones, 2) + 1).toString(2), 8);

            document.getElementById('binaryOutput').innerHTML = fancy(binary); //puts the binary in the Unsigned Binary field
            document.getElementById('onesOutput').innerHTML = fancy(ones); //puts the ones compliment in the One's Complement field
            document.getElementById('twosOutput').innerHTML = fancy(twos); //puts the twos compliment in the Two's Complement field
        }

        //adds leading zeros to achieve width
        function pad(n, width, z) {
            z = z || '0';
            n = n + '';
            return n.length >= width ? n : new Array(width - n.length + 1).join(z) + n;
        }

        //adds space every four digits
        function fancy(b) {
            return b.replace( /\d{4}/g, '$& ' ).replace( /\s$/,'');
        }
<h1>Group Project 1</h1>
<p>Enter a number between 0 and 255
  <input id="theInput" type="text" />
  <button onclick="doSomething()">Show Binary</button>
</p>
<p>Unsigned Binary: <span id="binaryOutput"></span>
</p>
<p>One's Complement: <span id="onesOutput"></span>
</p>
<p>Two's Complement: <span id="twosOutput"></span>
</p>

【讨论】:

  • 这是一个很大的帮助,我非常感谢您的时间和帮助。你真的救了我很大!非常感谢您的专业建议!
  • 不客气。你应该接受我的回答......也许投票赞成。 :-)
【解决方案2】:

您的主要错误是对补语系统的理解。基本上,您必须决定您的数字是从 0 到 255 还是从 -127 到 127。反转仅适用于负数(左侧第一位等于 1)或 127 以上的数字,而正数则适用不变(或从 0 到 127 的数字,还有一个负零,所有位都设置为 1,这是 255 的反码)。

所以,11 的补码是相同的 11 或 0000 1011 并且在二进制补码系统中也不会改变它,因为不需要加 1。

一旦您谈论有符号数并且您的无符号数高于 127,它会将最高位设置为 1,这表示负号。因此,假设我们有无符号数 129 = 1000 0001,一个补码将是 1111 1110(除第一个之外的所有位的反转),即 -126。 129 的补码将是 1111 1110 + 1 = 1111 1111 或 -127。

在检查输入数字时 - 类似这样

var i = parseInt(document.getElementById('theInput').value); 
if (i < 0 || i > 255 || isNaN(i)) { alert('Invalid input number'); return;}

而且,正如之前所说,var twos = pad((parseInt(ones, 2) + 1).toString(2), 8);

ps:http://jsbin.com/jahesosafana/1/edit

关于 128 号有一个有趣的时刻: -128 and 128 in 2's complement

在二进制补码表示法中,非负数表示为 它的普通二进制表示;在这种情况下,最重要的 位为 0。虽然,表示的数字范围与 带有无符号二进制数。例如,一个 8 位无符号数 可以表示值 0 到 255 (11111111)。然而一个二 补码 8 位数字只能表示 0 到 0 之间的正整数 127(01111111),因为其余的位组合最多 有效位为 '1' 表示负整数 -1 到 -128。

【讨论】:

  • 感谢所有回复的人,你们在帮助我完成这个学校项目方面非常棒!我知道它必须与我将“1”添加到二进制补码的方式有关,但我不确定需要完成的转换以及如何将它的补码添加到得到正确的补码值。
  • @Martin 不要忘记接受您认为最有用的答案。
猜你喜欢
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 2014-03-19
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
相关资源
最近更新 更多