⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 floattooldlg.cpp

📁 研究浮点运算的工具。在汇编下研究使用浮点运算
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
	m_OutputType = CFloatToolDlg::HEX;
	Convert();
}

void CFloatToolDlg::OnBnClickedFloat2()
{
	m_OutputType = CFloatToolDlg::FLOAT;
	Convert();
}

void CFloatToolDlg::OnBnClickedDec2()
{
	m_OutputType = CFloatToolDlg::DEC;
	Convert();
}

void CFloatToolDlg::OnBnClickedDouble2()
{
	m_OutputType = CFloatToolDlg::DOUBLE;
	Convert();
}

void CFloatToolDlg::OnBnClickedLongDouble2()
{
	m_OutputType = CFloatToolDlg::LONG_DOUBLE;
	Convert();
}

void CFloatToolDlg::OnBnClickedBin2()
{
	m_OutputType = CFloatToolDlg::BIN;
	Convert();
}

void CFloatToolDlg::OnBnClickedButton1()
{
	Convert();
}

void CFloatToolDlg::ClearFloatStr(void)
{
	m_SignBit = _T("");
	m_DecMantissa = _T("");
	m_HexMantissa = _T("");
	m_DecExponent = _T("");
	m_HexExponent = _T("");
	m_2Exponent = _T("");
	m_2Mantissa = _T("");
}

void CFloatToolDlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值

	CDialog::OnChar(nChar, nRepCnt, nFlags);
}

void CFloatToolDlg::OnBnClickedCancel()
{
	m_InputStr.SetWindowText(_T(""));
	Convert();
}

void CFloatToolDlg::OnBnClickedClearInput()
{
	OnBnClickedCancel();
}

void CFloatToolDlg::OnBnClickedQuit()
{
	OnCancel();
}

void CFloatToolDlg::OutputResult(tstring ostring)
{
	tstring tmps = ostring;
	char cseperator = _T('\0');
	if (m_Seperator == CFloatToolDlg::NO_SEPERATOR)
	{
		tmps = ostring;
	}
	else
	{
		if (m_Seperator == CFloatToolDlg::SPACE_SEPERATOR) 
			cseperator = _T(' ');
		if (m_Seperator == CFloatToolDlg::COMMA_SEPERATOR)
			cseperator = _T(',');
 		reverse(tmps.begin(),tmps.end());
		tstring::iterator beg = tmps.begin();
		int i =1;
		while (beg != tmps.end())
		{
			if (i%5 == 0)
			{
				beg = tmps.insert(beg,cseperator);
			}
			beg++;
			i++;
        }
		reverse(tmps.begin(),tmps.end());
	}
    m_OutputStr.SetWindowText(tmps.c_str());
}

void CFloatToolDlg::OnBnClickedNoSeperator()
{
	m_Seperator = CFloatToolDlg::NO_SEPERATOR;
	Convert();
}

void CFloatToolDlg::OnBnClickedSpaceSeperator()
{
	m_Seperator = CFloatToolDlg::SPACE_SEPERATOR;
	Convert();
}

void CFloatToolDlg::OnBnClickedCommaSeperator()
{
	m_Seperator = CFloatToolDlg::COMMA_SEPERATOR;
	Convert();
}

void CFloatToolDlg::EnableAllItem(void)
{
	CButton  *pchk;
	pchk = (CButton *)GetDlgItem(IDC_SIZE2);
	pchk->EnableWindow(TRUE);
	pchk = (CButton *)GetDlgItem(IDC_SIZE4);
	pchk->EnableWindow(TRUE);
	pchk = (CButton *)GetDlgItem(IDC_SIZE8);
	pchk->EnableWindow(TRUE);
	pchk = (CButton *)GetDlgItem(IDC_SIZE10);
	pchk->EnableWindow(TRUE);
	pchk = (CButton *)GetDlgItem(IDC_SIZE16);
	pchk->EnableWindow(TRUE);

	pchk = (CButton *)GetDlgItem(IDC_DOUBLE2);
	pchk->EnableWindow(TRUE);
	pchk = (CButton *)GetDlgItem(IDC_FLOAT2);
	pchk->EnableWindow(TRUE);

	//pchk = (CButton *)GetDlgItem(IDC_NO_SEPERATOR);
	//pchk->EnableWindow(TRUE);
	pchk = (CButton *)GetDlgItem(IDC_SPACE_SEPERATOR);
	pchk->EnableWindow(TRUE);
	pchk = (CButton *)GetDlgItem(IDC_COMMA_SEPERATOR);
	pchk->EnableWindow(TRUE);

}

void CFloatToolDlg::SetInterFaceItem(void)
{
	CButton  *pchk;
	EnableAllItem();
	switch(m_Type)
	{
	case CFloatToolDlg::HEX:
	case CFloatToolDlg::DEC:
	case CFloatToolDlg::BIN:
		{
		}
		break;
	case CFloatToolDlg::FLOAT:
	case CFloatToolDlg::DOUBLE:
		{
			pchk = (CButton *)GetDlgItem(IDC_SIZE2);
			pchk->SetCheck(BST_UNCHECKED);
			pchk->EnableWindow(FALSE);
			pchk = (CButton *)GetDlgItem(IDC_SIZE4);
			pchk->SetCheck(BST_UNCHECKED);
			pchk->EnableWindow(FALSE);
			pchk = (CButton *)GetDlgItem(IDC_SIZE8);
			pchk->SetCheck(BST_UNCHECKED);
			pchk->EnableWindow(FALSE);
			pchk = (CButton *)GetDlgItem(IDC_SIZE10);
			pchk->SetCheck(BST_UNCHECKED);
			pchk->EnableWindow(FALSE);
			pchk = (CButton *)GetDlgItem(IDC_SIZE16);
			pchk->SetCheck(BST_UNCHECKED);
			pchk->EnableWindow(FALSE);
			if (m_Type == CFloatToolDlg::FLOAT )
			{
				m_Size = 4;
				pchk = (CButton *)GetDlgItem(IDC_SIZE4);
				pchk->EnableWindow(TRUE);
				pchk->SetCheck(BST_CHECKED);

			}
			else
			{
				m_Size = 8;
				pchk = (CButton *)GetDlgItem(IDC_SIZE8);
				pchk->EnableWindow(TRUE);
				pchk->SetCheck(BST_CHECKED);
			}	
		}
		break;
	default:
		AddError(ERR_SWITCH_DEFAULT);
		break;
	};

	switch(m_Size)
	{
	case 2:
	case 10:
	case 16:
		{
			pchk = (CButton *)GetDlgItem(IDC_DOUBLE2);
			pchk->SetCheck(BST_UNCHECKED);
			pchk->EnableWindow(FALSE);
			pchk = (CButton *)GetDlgItem(IDC_FLOAT2);
			pchk->SetCheck(BST_UNCHECKED);
			pchk->EnableWindow(FALSE);
			if (m_OutputType == CFloatToolDlg::DOUBLE
				|| m_OutputType == CFloatToolDlg::FLOAT)
			{
				m_OutputType = CFloatToolDlg::HEX;
				pchk = (CButton *)GetDlgItem(IDC_HEX2);
				pchk->SetCheck(BST_CHECKED);
			}
		}
		break;
	case 4:
		{
			if (m_OutputType == CFloatToolDlg::DOUBLE )
			{
				m_OutputType = CFloatToolDlg::HEX;
				pchk = (CButton *)GetDlgItem(IDC_HEX2);
				pchk->SetCheck(BST_CHECKED);
			};

			pchk = (CButton *)GetDlgItem(IDC_DOUBLE2);
			pchk->SetCheck(BST_UNCHECKED);
			pchk->EnableWindow(FALSE);
			pchk = (CButton *)GetDlgItem(IDC_FLOAT2);
//			pchk->SetCheck(BST_UNCHECKED);
			pchk->EnableWindow(TRUE);
		}
		break;
	case 8:
		{
			if (m_OutputType == CFloatToolDlg::FLOAT )
			{
				m_OutputType = CFloatToolDlg::HEX;
				pchk = (CButton *)GetDlgItem(IDC_HEX2);
				pchk->SetCheck(BST_CHECKED);
			};
			pchk = (CButton *)GetDlgItem(IDC_FLOAT2 );
			pchk->SetCheck(BST_UNCHECKED);
			pchk->EnableWindow(FALSE);
			pchk = (CButton *)GetDlgItem(IDC_DOUBLE2);
			pchk->EnableWindow(TRUE);
		}
		break;
	default:
		AddError(ERR_SWITCH_DEFAULT);
	};

	switch(m_OutputType)
	{
	case CFloatToolDlg::HEX:
	case CFloatToolDlg::DEC:
	case CFloatToolDlg::BIN:
		{
		}
		break;
	case CFloatToolDlg::FLOAT:
	case CFloatToolDlg::DOUBLE:
		{
			pchk = (CButton *)GetDlgItem(IDC_SPACE_SEPERATOR);
			pchk->SetCheck(BST_UNCHECKED);
			pchk->EnableWindow(FALSE);
			pchk = (CButton *)GetDlgItem(IDC_COMMA_SEPERATOR);
			pchk->SetCheck(BST_UNCHECKED);
			pchk->EnableWindow(FALSE);
			pchk = (CButton *)GetDlgItem(IDC_NO_SEPERATOR);
			pchk->SetCheck(BST_CHECKED);
			m_Seperator = CFloatToolDlg::NO_SEPERATOR;
		}
		break;
	default:
		AddError(ERR_SWITCH_DEFAULT);

		break;
	};
}

tstring CFloatToolDlg::GetInputStr(void)
{
	CString in;
	m_InputStr.GetWindowText(in);
	tstring sdelSpace(in.GetBuffer());
	in.ReleaseBuffer();
	return sdelSpace;
}

tstring CFloatToolDlg::Filter(const tstring& s)
{
	tstring sdelSpace = s;
	tstring::iterator beg  = sdelSpace.begin();

	while (beg != sdelSpace.end())
	{
		if (*beg == _T(' ') || *beg == _T(',') ) 
			beg = sdelSpace.erase(beg);
		else
			beg++;
	}
	beg = sdelSpace.begin();
	while (beg != sdelSpace.end())
	{
		if (*beg == _T('0')) 
			beg = sdelSpace.erase(beg);
		else
			break;
	}
	return sdelSpace;
}


BOOL CFloatToolDlg::GetInput(tstring in)
{
	tstring sdelSpace = Filter(in);
	if ( sdelSpace.empty())
	{
		AddError(ERR_CLEAR_OUTPUT);
		return FALSE;
	}
	DWORD ret;
	BOOL isSucessful = FALSE;
	tistringstream istr(sdelSpace);
	memset(&m_m128, 0, sizeof(m_m128));
	switch(m_Size)
	{
	case 10:
	case 16:
		ret = m_BigInt.AtoI(sdelSpace, m_Type, m_Size);
		if (ret == ERR_SUCCESS)
		{
			isSucessful = TRUE;
		}
		else
		{
			AddError(ret);
		}
		break;
	default:
		switch(m_Type)
		{
		case CFloatToolDlg::HEX :
			{
				istr>> hex ;
				switch(m_Size)
				{
				case 2:
					{
						istr>> m_m128.m128i.m128i_u16[0];
						break;
					}
				case 4:
					{
						istr>> m_m128.m128i.m128i_u32[0];
						break;
					}
					//case 6:
					//	{
					//		break;
					//2	}
				case 8:
					{
						istr>> m_m128.m128i.m128i_u64[0];
						break;
					}
				default:
					AddError(ERR_SWITCH_DEFAULT) ;
					break;
				}
				break;
			}
		case CFloatToolDlg::DEC :
			{
				istr>> dec ;
				switch(m_Size)
				{
				case 2:
					{
						istr>> m_m128.m128i.m128i_i16[0];
						break;
					}
				case 4:
					{
						istr>> m_m128.m128i.m128i_i32[0];
						break;
					}
					//case 6:
					//	{
					//		break;
					//2	}
				case 8:
					{
						istr>> m_m128.m128i.m128i_i64[0];
						break;
					}
				default:
					AddError(ERR_SWITCH_DEFAULT) ;
					break;
				}
				break;
			}
		case CFloatToolDlg::BIN :
			{
				if (m_Size < 9)
				{	
					reverse(sdelSpace.begin(),sdelSpace.end());
					int len = sdelSpace.length();
					if (len <= m_Size*8)
					{
						for ( int i=0; i< m_Size*8 && i < len; i++)
						{
							if ( sdelSpace[i] == _T('1'))
							{
								m_m128.m128i.m128i_u32[i/32] |= (1 << (i%32)) ;
							}
							else
							{
								if ( sdelSpace[i] == _T('0'))
								{
								}
								else
								{
									AddError(ERR_INVALID_FORMAT);
									break;
								}
							}
						}
						isSucessful = TRUE;
					}
					else
					{
						AddError(ERR_DATA_SIZE);	
					}
				}
				break;
			}
		case CFloatToolDlg::FLOAT :
			{
				istr>> m_m128.m128f.m128_f32[0];
				break;
			}
		case CFloatToolDlg::DOUBLE :
			{
				istr>> m_m128.m128d.m128d_f64[0];
				break;
			}
		case CFloatToolDlg::LONG_DOUBLE : 
			{
				istr>> m_m128.m128d.m128d_f64[0];
				break;
			}
		default:
			AddError(ERR_SWITCH_DEFAULT) ;
		}
	}	//switch(m_Size)

	if (!isSucessful)
	{
		if (istr.fail() || istr.bad() || (!istr.eof()))
		{
			AddError(ERR_INVALID_FORMAT);
		}
	}

	if (GetLastError() == ERR_NO_FOUND_ERROR)
		return TRUE;
	else
		return FALSE;
}

void CFloatToolDlg::OutputMsg(const tstring & msg)const 
{
	//m_OutputStr.SetWindowText((msg.c_str())) ;	
	CEdit  *pchk;
	pchk = (CEdit *)GetDlgItem(IDC_OUT_BIN2);
	pchk->SetWindowText(msg.c_str()) ;	
}

void CFloatToolDlg::Convert(void)
{
	SetInterFaceItem();
	if (GetInput(GetInputStr()))
	{
		GenOutput();
	}
	if (GetLastError() != ERR_NO_FOUND_ERROR)
	{
		if (GetLastError() == ERR_CLEAR_OUTPUT)
		{
			OutputMsg(tstring(_T("")));
		}
		else
		{
			ReportAllError();
		}
		ClearAllError();	
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -