javascript,我的两个补充是没有产生正确的数字

时间:2014-10-09 22:46:34

标签: javascript css

我正在为我的计算机科学课写一个基本的计算器,它取一个介于0到255之间的数字,并将其转换为二进制,一个补码,以及两个补码。我和另一个学生一直在共同努力,我们都被困在了两个补充,它产生了错误的价值。例如,如果我们输入11,那么两个补码应该是" 1111 1011"但我得到" 1111 0101"我不确定是什么问题?

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

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

另外,我真的想添加一些错误检查,例如,如果用户输入负数,或者如果用户输入的值不在0-255的值范围内,那么有人可以帮助我?我真的想要弹出一个说,"我很抱歉你需要在0-255和#34之间输入一个值;

我很抱歉这么多,但我不知道还有什么地方要转!我已经多次访问stackoverflow以帮助解决问题,这是我第一次发布一个我不知道如何解决的问题!

非常感谢您的时间和帮助!

-Martin

以下是代码:

<!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>

2 个答案:

答案 0 :(得分:0)

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

您应该使用twos = pad((parseInt(ones, 2) + 1).toString(2), 8);代替。请参阅下面的代码段。

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>

答案 1 :(得分:0)

你的主要错误是理解补充系统。基本上,您必须决定是否有从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

  

在两个补码表示法中,非负数表示为   它的普通二进制表示;在这种情况下,最重要的   bit是0.但是,表示的数字范围不一样   用无符号二进制数。例如,一个8位无符号数   可以表示值0到255(11111111)。然而,两个人   补码8位数只能表示从0到0的正整数   127(01111111),因为其余的位组合最多   重要的是&#39; 1&#39;表示负整数-1到-128。