- 作者簡(jiǎn)介:一名后端開(kāi)發(fā)人員,每天分享后端開(kāi)發(fā)以及人工智能相關(guān)技術(shù),行業(yè)前沿信息,面試寶典。
- 座右銘:未來(lái)是不可確定的,慢慢來(lái)是最快的。
- 個(gè)人主頁(yè):極客李華-CSDN博客
- 合作方式:私聊+
- 這個(gè)專(zhuān)欄內(nèi)容:BAT等大廠常見(jiàn)后端java開(kāi)發(fā)面試題詳細(xì)講解,更新數(shù)目100道常見(jiàn)大廠java后端開(kāi)發(fā)面試題。
- 我的CSDN社區(qū):https://bbs.csdn.net/forums/99eb3042821a4432868bb5bfc4d513a8
- 微信公眾號(hào),抖音,b站等平臺(tái)統(tǒng)一叫做:極客李華,加入微信公眾號(hào)領(lǐng)取各種編程資料,加入抖音,b站學(xué)習(xí)面試技巧,職業(yè)規(guī)劃
前言:浮點(diǎn)數(shù)的加減法與是否溢出的判斷,是計(jì)算機(jī)組成原理中的數(shù)據(jù)存儲(chǔ)的一個(gè)入門(mén)。
題目:已知x和y,用變形補(bǔ)碼計(jì)算x+y,并判斷結(jié)果是否溢出。
(1)x = 0.11010, y = 0.10111
(2)x = 0.11101, y = -0.10100
(3)x = -0.10111, y = -0.11000
計(jì)算方法很簡(jiǎn)單,就是先把x, y轉(zhuǎn)換成補(bǔ)碼,然后補(bǔ)碼相加就可以,計(jì)算機(jī)的計(jì)算中都是把減法當(dāng)做加法使用。對(duì)于負(fù)數(shù)那么就在原來(lái)的基礎(chǔ)之上前面加一個(gè)1,作為符號(hào)位,然后符號(hào)位不變?cè)偃》醇右弧?br>
比如:
對(duì)于(2)題
-0.11010->10.11010->11.00101->11.00110
然后相加,結(jié)果為:
00.11101+11.00110=00.01001
至于溢出情況,如果01就是正溢出,00,11未溢出,10負(fù)溢出。
知道原理了,然后我們就可以寫(xiě)代碼了。
我的代碼如下:
#include<bits/stdc++.h>
using namespace std;
string Complement(string code) // 對(duì)二進(jìn)制浮點(diǎn)數(shù)求補(bǔ)碼
{
string t = '1' + code;
// 是否進(jìn)位
bool flag = false;
// 先求反碼
for (int i = t.size() - 1; i >= 1; -- i)
{
if (t[i] == '.') continue;
if (t[i] == '0') t[i] = '1';
else t[i] = '0';
}
// cout << "反碼為:" + t << endl;
// 再加1
for (int i = t.size() - 1; i >= 1; -- i)
{
// cout << "補(bǔ)碼為:" + t << endl;
if (t[i] == '.') continue;
if (i == t.size() - 1) // 求反加1
{
if (t[i] == '1')
{
flag = true;
t[i] = '0';
}
else t[i] = '1';
}
else
{
if (flag == true) // 有進(jìn)位
{
if (t[i] == '0') // 不需要進(jìn)位
{
flag = false;
t[i] = '1';
}
else // 需要進(jìn)位
{
flag = true;
t[i] = '0';
}
}
}
}
// cout << "補(bǔ)碼為:" + t << endl;
return t;
}
string Add(string x, string y) // 補(bǔ)碼相加
{
bool flag = false; // 判斷是否進(jìn)位
string res = "";
for (int i = x.size() - 1; i >= 0; -- i)
{
// cout << "res :" + res << " ";
// if (flag) cout << "true\n";
// else cout << "false\n";
if (x[i] == '.')
{
res += '.';
continue;
}
if (x[i] == y[i] && x[i] == '1')
{
if (flag) res += '1';
else res += '0';
flag = true;
}
else if (x[i] == y[i] && x[i] == '0')
{
if (flag)
{
res += '1';
flag = false;
}
else res += '0';
}
else if (x[i] != y[i]) // 兩個(gè)不同
{
if (flag) // 有進(jìn)位
{
flag = true;
res += '0';
}
else // 沒(méi)有進(jìn)位
{
flag = false;
res += '1';
}
}
}
reverse(res.begin(), res.end());
return res;
}
string Jude(string res) // 判斷是否溢出
{
if (res[0] == res[1]) return "未溢出";
else if (res[0] == '1') return "負(fù)溢出";
else return "正溢出";
}
int main()
{
string x, y;
string res = "";
cout << "輸入x:";
cin >> x;
cout << "輸入y:";
cin >> y;
string tx = x;
string ty = y;
if (x[0] == '-') // 如果是負(fù)數(shù) 那么它的補(bǔ)碼就需要變一下
{
tx = Complement(x.substr(1));
}
else tx = '0' + x;
if (y[0] == '-')// 如果是負(fù)數(shù) 那么它的補(bǔ)碼就需要變一下
{
ty = Complement(y.substr(1));
}
else ty = '0' + y;
// res = Add(tx, ty); // 這部分為計(jì)算[x+y]的情況
// cout << "\n[x + y]補(bǔ)=" + res + '\n';
// cout << "溢出情況為:" + Jude(res) + '\n';
if (y[0] == '-') // // 這部分為計(jì)算[x-y]的情況
{
y[0] = '0';
res = Add(tx, y);
}
else res = Add(tx, Complement(y));
cout << "[x - y]補(bǔ)=" + res + '\n';
cout << "溢出情況為:" + Jude(res) + '\n';
return 0;
}
測(cè)試結(jié)果如下:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-506972.html
如果大家覺(jué)得有用的話(huà),可以關(guān)注我下面的微信公眾號(hào),極客李華,我會(huì)在里面更新更多行業(yè)資訊,企業(yè)面試內(nèi)容,編程資源,如何寫(xiě)出可以讓大廠面試官眼前一亮的簡(jiǎn)歷,讓大家更好學(xué)習(xí)編程,我的抖音,B站也叫極客李華。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-506972.html
到了這里,關(guān)于用補(bǔ)碼計(jì)算x+y,并判斷結(jié)果是否溢出問(wèn)題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!