怎样将二进制补码转化为原码?该如何处理

怎样将二进制补码转化为原码?
如,怎样将二进制补码1000001111000011010010010,0000101011110000101011110001010,101010111110101010001,01010100001111等化为原码的形式?
有现成的函数能直接转换吗?

------解决方案--------------------
C/C++ code

#include<climits>
#include<string>
#include<iostream>
#include<bitset>
using namespace std;
#define BINARY_BIT (20)
#define BINARY_SIGN (1<<(BINARY_BIT-1))
#define BINARY_MASK (~-(1<<BINARY_BIT))
string true_form_long(const string& complement)
{
    bitset<sizeof(long)*8> bits(complement);
    unsigned long val = bits.to_ulong();
    if(val > (unsigned long)(BINARY_SIGN-1))
    {
        val=(val&(BINARY_SIGN-1));
        return bitset<sizeof(long)*8>(((~val+1)|BINARY_SIGN)&BINARY_MASK).to_string().substr(32-BINARY_BIT);
    }
    if(complement.size()<BINARY_BIT)
    {
        string s(BINARY_BIT-complement.size(),'0');
        return s+complement;
    }
    return complement;
}
string not_code(const string & complement)
{
    bitset<sizeof(long)*8> bits(complement);
    unsigned long val = bits.to_ulong();
    return bitset<sizeof(long)*8>((~val)&BINARY_MASK).to_string().substr(32-BINARY_BIT);
}
void test_long(long val)
{
    cout<<"补码数字:"<<val<<"\n";
    bitset<32> a(val);
    cout<<"补码:"<<a.to_string().substr(32-BINARY_BIT)<<"\n";
    cout<<"原码:"<<true_form_long(a.to_string())<<"\n";
    cout<<"反码:"<<not_code(a.to_string())<<endl;
 //   bitset<32> b(true_form_long(a.to_string()));
 //   cout<<b.to_string()<<endl;
}
void test_string(const string& str)
{
    if(str.size()==32)
        cout<<"补码:"<<str.substr(32-BINARY_BIT)<<"\n";
    else
        {
        string s(BINARY_BIT-str.size(),'0');
        cout<<"补码:"<<s+str<<endl;
        }
    cout<<"原码:"<<true_form_long(str)<<"\n";
    cout<<"反码:"<<not_code(str)<<endl;
}
int main()
{
    string str="1000001111000011010010010";
    bitset<32> a(str);
    cout<<a.to_ulong()<<endl;
    cout<<true_form_long(str)<<endl;
    for(long i=-10;i<0;i++)
    {
        test_long(i);
        cout<<endl;
    }
    puts("输入补码");
    string s;
    cin>>s;
    test_string(s);
}