gpt4 book ai didi

c++ - C++ 中的 2 的补码转换器

转载 作者:行者123 更新时间:2023-11-30 00:53:35 26 4
gpt4 key购买 nike

我被卡住了,我已经查看我的代码几个小时了,但我似乎无法弄清楚哪里出了问题。我的函数所做的是,它将接受负数或正数并将其转换为其 32 位 2 的补码十六进制表示形式。我的函数接受一个字符数组(以 32 位符号大小表示)并获取数组的 2 的补码。我将其转换为 2 的补码的方法是在看到某个字符时将一个字符简单地分配到数组中。如果在数组中看到的字符是第一个字符,则会出现特殊情况。其余的通常被否定。我目前卡住了。当我输入值 -23(带符号的幅度为 80000017)时,我得到值 K00000KK。 -23452(符号幅度 80005B9C)--> K000KKKK。我将值设置为“K”以找出代码卡在何处,原始值是“7”。在代码中,我放置了显示消息以查看编译器的去向

for -23 (80000017) input I get the messages

first 1 is seen, leave first 1 the same
first 1 is seen, leave first 1 the same
no one's showed up yet --> 0
no one's showed up yet --> 0
no one's showed up yet --> 0
no one's showed up yet --> 0
no one's showed up yet --> 0
first 1 is seen, leave first 1 the same

几乎显示 K 的地方是我收到第一条消息的地方,而显示 0 的地方我收到 --> 0 消息

感谢您的帮助!非常感激!

这是我的代码的 pastebin 链接,因为代码的格式让我很烦......

http://pastebin.com/KSeymwcs

char* two_complement(int number, char* sign_mag_array){

int first_one_flag = 0;

if(number > 0){
cout << "positive number" << endl;
return sign_mag_array;
}

if(number < 0){
for(int q = 7; q >= 0; q--){
if(first_one_flag == 1){ // negate the rest regularly
cout << "negate normally " << endl;

if(sign_mag_array[q] == '0'){
sign_mag_array[q] = 'F';
}
if(sign_mag_array[q] == '1'){
sign_mag_array[q] = 'E';
}
if(sign_mag_array[q] == '2'){
sign_mag_array[q] = 'D';
}
if(sign_mag_array[q] == '3'){
sign_mag_array[q] = 'C';
}
if(sign_mag_array[q] == '4'){
sign_mag_array[q] = 'D';
}
if(sign_mag_array[q] == '5'){
sign_mag_array[q] = 'A';
}
if(sign_mag_array[q] = '6'){
sign_mag_array[q] = '9';
}
if(sign_mag_array[q] == '7'){
sign_mag_array[q] = '8';
}
if(sign_mag_array[q] == '8'){
sign_mag_array[q] = '7';
}
if(sign_mag_array[q] = '9'){
sign_mag_array[q] = '6';
}
if(sign_mag_array[q] == 'A'){
sign_mag_array[q] = '5';
}
if(sign_mag_array[q] == 'B'){
sign_mag_array[q] = '4';
}
if(sign_mag_array[q] = 'C'){
sign_mag_array[q] = '3';
}
if(sign_mag_array[q] == 'D'){
sign_mag_array[q] = '2';
}
if(sign_mag_array[q] == 'E'){
sign_mag_array[q] = '1';
}
if(sign_mag_array[q] == 'F'){
sign_mag_array[q] = '0';
}
}


if(sign_mag_array[q] == '0' && first_one_flag == 0){
cout << "no one's showed up yet --> 0 " << endl;
}
else{ // first '1' in binary seen. special negating
//first_one_flag = 1;
cout << "first 1 is seen, leave first 1 the same " << endl;

if(sign_mag_array[q] == '1'){
sign_mag_array[q] = 'F';
}
if(sign_mag_array[q] == '2'){
sign_mag_array[q] = 'E';
}
if(sign_mag_array[q] == '3'){
sign_mag_array[q] = 'D';
}
if(sign_mag_array[q] == '4'){
sign_mag_array[q] = 'C';
}
if(sign_mag_array[q] == '5'){
sign_mag_array[q] = 'B';
}
if(sign_mag_array[q] == '6'){
sign_mag_array[q] = 'A';
}
if(sign_mag_array[q] = '7'){
sign_mag_array[q] = '9';
}
if(sign_mag_array[q] == '8'){
sign_mag_array[q] = '8';
}
if(sign_mag_array[q] == '9'){
sign_mag_array[q] = 'K';
}
if(sign_mag_array[q] == 'A'){
sign_mag_array[q] = '6';
}
if(sign_mag_array[q] == 'B'){
sign_mag_array[q] = '5';
}
if(sign_mag_array[q] == 'C'){
sign_mag_array[q] = '4';
}
if(sign_mag_array[q] == 'D'){
sign_mag_array[q] = '3';
}
if(sign_mag_array[q] == 'E'){
sign_mag_array[q] = '2';
}
if(sign_mag_array[q] == 'F'){
sign_mag_array[q] = '1';
}
}
}
}
return sign_mag_array;

最佳答案

错误很简单

        if(sign_mag_array[q] = '7'){
sign_mag_array[q] = '9';
}

应该是

        if(sign_mag_array[q] == '7'){
sign_mag_array[q] = '9';
}

        if(sign_mag_array[q] = 'C'){
sign_mag_array[q] = '3';
}

应该是

        if(sign_mag_array[q] == 'C'){
sign_mag_array[q] = '3';
}

        if(sign_mag_array[q] = '9'){
sign_mag_array[q] = '6';
}

应该是

        if(sign_mag_array[q] == '9'){
sign_mag_array[q] = '6';
}

等等。我想你明白了,

有这么多重复的代码是糟糕的风格,并且很容易犯这样的错误。您应该能够通过一点数学知识大大简化和缩短这段代码。

例如添加两个函数将十六进制数字转换为整数,反之亦然

int hex_to_int(char x)
{
return x <= '9' ? x - '0' : 10 + (x - 'A');
}

char int_to_hex(int x)
{
return x < 10 ? '0' + x : 'A' + (x - 10);
}

现在像这样编写代码

       if(sign_mag_array[q] == '0'){
sign_mag_array[q] = 'F';
}
if(sign_mag_array[q] == '1'){
sign_mag_array[q] = 'E';
}
...
if(sign_mag_array[q] == 'E'){
sign_mag_array[q] = '1';
}
if(sign_mag_array[q] == 'F'){
sign_mag_array[q] = '0';
}

成为

     if (sign_mag_array[q] >= '0' && sign_mag_array[q] <= '9' || 
sign_mag_array[q] >= 'A' && sign_mag_array[q] <= 'F')
{
int digit = hex_to_int(sign_mag_array[q]);
sign_mag_array[q] = int_to_hex(15 - digit);
}

将 48 行重复代码减少到很少。作为奖励,它还解决了 Zeta 发现的问题。

关于c++ - C++ 中的 2 的补码转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16029485/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com