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

0

    <機能>

    (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;
    }

     

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


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

     
     



    selected entries

    categories

    calendar

    S M T W T F S
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
    << May 2019 >>

    profile

    others

    archives