复数正负号问题处理【编程】

来源:互联网 发布:韩国媚日 知乎 编辑:程序博客网 时间:2024/06/05 09:24

华为最新编程题,关于复数的问题,就是一个复数由32位的整形构成,高16位代表实部,低16位代表虚部,就是正负号的问题,整了很久,挂了,太悲剧了。




#include <iostream>using namespace std;int a[] = {1, -1};short int gethigh(long int num){    bool flag = false;    if(num<0)    {        flag  = true;        num *= -1;    }    short int temp = num>>16;    return a[(flag?1:0)]*(temp & 0x7fff);}short int getlow(long int num){    if(num<0)    num *= -1;    return (num & 0x0007fff)*a[(num & 0x00008000)?1:0];}long int togeather(short int num1, short int num2){    bool flag1=false, flag2=false;    if(num1 & 0x8000)    {        flag1 = true;        num1 *= -1;    }    if(num2 & 0x8000)    {        flag2 = true;        num2 *= -1;    }    long int temp = 0;    num1 &= 0x7fff;    num2 &= 0x7fff;    temp = (num1<<16 | num2);    if(flag2)    temp |= 0x00008000;    if(flag1)    temp *= -1;    return temp;}int main(){    long int num1, num2;    short int ss1[4];    short int ss2[4];    cin>>num1;    ss1[0] = gethigh(num1);    ss2[0] = getlow(num1);    cout<<ss1[0]<<" "<<ss2[0]<<endl<<endl;    cout<<togeather(ss1[0],ss2[0])<<" ";    return 0;}