我正在为我的计算机科学课写一个基本的计算器,它取一个介于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>
答案 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。