【VC++】2進数を10進数に変換/10進数を2進数に変換

<機能>

(1)エディットボックスに入力された2進数文字列を10進数文字列に変換する

(2)エディットボックスに入力された10進数文字列を2進数文字列に変換する

 

<動作検証&開発環境>
Visual Studio Community 2017

Version15.9.7

 

<イメージ>

MFC,2進数文字列を10進数文字列に変換

 

<使い方>

(1)MFCアプリケーションでプロジェクトを作成

(2)アプリケーションの種類に ダイアログベース を指定

MFCアプリケーション

(3)ダイアログにUIを配置する

リソースエディター

(4)エディットボックスにメンバ変数を追加する

※UpdateDataでアクセスするため

エディットボックスにメンバ変数を追加

(5)ラベルにメンバ変数を追加する

※UpdateDataでアクセスするため

ラベルにメンバ変数を追加

(6)ソースを追加する

 

 

MFCApplication1Dlg.h

class CMFCApplication1Dlg : public CDialogEx
{
    //~~省略~~


public:
    afx_msg void OnBnClickedButton1();
    CString m_Edit1;
    CButton *cb;
    CString m_Label1;
};

MFCApplication1Dlg.cpp

//プロトタイプ宣言
CString ConvertBinary2Decimal(CString moji);
CString ConvertDecimal2Binary(CString moji);

CMFCApplication1Dlg::CMFCApplication1Dlg(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_MFCAPPLICATION1_DIALOG, pParent)
    , m_Edit1(_T(""))
    , m_Label1(_T(""))
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMFCApplication1Dlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_EDIT1, m_Edit1);
    DDX_Text(pDX, IDC_Label1, m_Label1);
}

BEGIN_MESSAGE_MAP(CMFCApplication1Dlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BUTTON1, &CMFCApplication1Dlg::OnBnClickedButton1)
END_MESSAGE_MAP()

BOOL CMFCApplication1Dlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

 

    //〜〜省略〜〜

    //ラジオボタンの初期値を設定
    cb = (CButton*)GetDlgItem(IDC_RADIO1);
    cb->SetCheck(TRUE);

    return TRUE;
}

/******************************************************
ボタンクリックイベントハンドラ
ラジオボタンの選択により処理を分岐する
  2進数を10進数に変換:ConvertBinary2Decimal
  10進数を2進数に変換:ConvertDecimal2Binary
******************************************************/

void CMFCApplication1Dlg::OnBnClickedButton1()
{
    CString cs,csRet;
    //エディットボックスの内容をメンバ変数にセット
    UpdateData(TRUE);
    if (m_Edit1.GetLength() == 0) return;

    //入力文字列チェック&変換
    if (cb->GetCheck())
    {
        //入力値チェック
        if (m_Edit1 != m_Edit1.SpanIncluding(L"01"))
        {
            AfxMessageBox(L"2進数は0か1を入力してください", MB_ICONERROR);
            return;
        }
        else
        {
            //上限桁数はunsigned intのマックス値まで
            if (m_Edit1.GetLength() > 32)
            {
                AfxMessageBox(L"入力2進数は32桁がマックス値です", MB_ICONERROR);
                return;
            }
        }

        //2進数から10進数に変換
        m_Label1 = ConvertBinary2Decimal(m_Edit1);
        UpdateData(FALSE);

    }
    else
    {
        //入力値チェック
        if (m_Edit1 != m_Edit1.SpanIncluding(L"0123456789"))
        {
            AfxMessageBox(L"10進数は0-9の数値を入力してください", MB_ICONERROR);
            return;
        }
        else
        {
            //上限桁数はunsigned intのマックス値まで
            if (m_Edit1.GetLength() > 10)
            {
                AfxMessageBox(L"入力10進数は10桁がマックス値です", MB_ICONERROR);
                return;
            }
            else if (m_Edit1.GetLength() == 10)
            {
                if (m_Edit1 > L"4294967295")
                {
                    AfxMessageBox(L"入力10進数はunsigned intの上限がマックス値です", MB_ICONERROR);
                    return;
                }
            }
        }

        //10進数から2進数に変換
        m_Label1 = ConvertDecimal2Binary(m_Edit1);
        UpdateData(FALSE);
    }
}

/******************************************************
2進数文字列を10進数文字列に変換する
符号なし/unsigned intのマックス値まで変換可能
引 数:2進数文字列
戻り値:10進数文字列
******************************************************/

CString ConvertBinary2Decimal(CString moji)
{
    CString csRet(L""),cwk;
    unsigned int uiRet = 0;
    for (int i = 0; i < moji.GetLength(); i++)
    {
        cwk = moji.Mid(i, 1);
        if (cwk == L"1")
        {
            uiRet += (unsigned int)pow(2, (moji.GetLength() - 1) - i);
        }
    }
    csRet.Format(L"%u",uiRet);
    return csRet;
}

/******************************************************
10進数文字列を2進数文字列に変換する
符号なし/unsigned intのマックス値まで変換可能
引 数:10進数文字列
戻り値:2進数文字列
******************************************************/

CString ConvertDecimal2Binary(CString moji)
{
    CString csRet(L""), cwk;
    wchar_t wt[20];
    ZeroMemory(&wt, sizeof(wchar_t) * 20);
    wsprintf(wt,L"%s", moji);

    unsigned int idecimal = 0,ui;
    //_ttoiによる数値変換だとintの最大値に丸められるため独自に計算する
    //idecimal = _ttoi(moji)
    for (int i = 0; i < moji.GetLength(); i++)
    {
        cwk = moji.Mid(i, 1);
        ui = _ttoi(cwk);
        idecimal += ((unsigned int)pow(10, (moji.GetLength() - 1) - i) * ui);
    }

    unsigned int syo, amari;
    for(;;)
    {
        syo = idecimal / 2;
        amari = idecimal % 2;

        cwk.Format(L"%u",amari);
        csRet = (cwk + csRet);

        //商が0になったら終了
        if (syo == 0) break;
        idecimal = syo;
    }
    return csRet;
}

 

よろしければポチッと押してください


プログラマー ブログランキングへ



| 1/60PAGES | >>

selected entries

categories

calendar

S M T W T F S
     12
3456789
10111213141516
17181920212223
2425262728  
<< February 2019 >>

profile

others

archives