C++ 如何在表达式计算器中处理二进制整数

C++ 如何在表达式计算器中处理二进制整数,c++,C++,我的表达式计算器的标记器中有一个函数,它根据用户在程序的UI部分输入的字符生成整数。我现在正在尝试处理BinaryInteger,想知道如何检查二进制数。有没有一种方法可以访问计算机读取正常整数的方式,或者我可以用其他方法吗 Token::pointer_type Tokenizer::_get_number( Tokenizer::string_type::const_iterator& currentChar, Tokenizer::string_type const& ex

我的表达式计算器的标记器中有一个函数,它根据用户在程序的UI部分输入的字符生成整数。我现在正在尝试处理BinaryInteger,想知道如何检查二进制数。有没有一种方法可以访问计算机读取正常整数的方式,或者我可以用其他方法吗

Token::pointer_type Tokenizer::_get_number( Tokenizer::string_type::const_iterator& currentChar, Tokenizer::string_type const& expression ){

assert( isdigit( *currentChar ) && "currentChar must pointer to a digit" );

// Check for binary number
// To Do: BinaryInteger code.

// Either Integer or Real
Integer::value_type const MAX_UNSIGNED_D10 = (std::numeric_limits<Integer::value_type>::max()-10)/10;
Integer::value_type accumulator = *currentChar++ - '0';

while( currentChar != end(expression) && isdigit(*currentChar) && accumulator <= MAX_UNSIGNED_D10 )
    accumulator = accumulator * 10 + *currentChar++ - '0';

if( currentChar == end(expression) || (!isdigit( *currentChar ) && *currentChar != '.' ) )
    return make<Integer>( accumulator );

// either a real number or too big for an integer
return make<Integer>( 0 );  // replace with Real number code.
}
Token::pointer\u type标记器::\u get\u number(标记器::string\u type::const\u迭代器和currentChar,标记器::string\u type const和表达式){
断言(isdigit(*currentChar)&“currentChar必须指向数字的指针”);
//检查二进制数
//要执行的操作:二进制Integer代码。
//整数或实数
整数::value_type const MAX_UNSIGNED_D10=(std::numeric_limits::MAX()-10)/10;
整数::值_类型累加器=*currentChar++-'0';

而(currentChar!=end(expression)&&isdigit(*currentChar)&&acculator一个二进制数只由0和1组成。但是,无法判断像
11010
这样的数字是指“11000”还是“二十六”除非你想办法。这不是二进制和十进制的唯一问题。这也是八进制和十六进制的问题

多年来,有很多方法可以区分不同半径的常数。C/C++使用前缀
0
0x
来识别八进制和十六进制。二进制没有。一些汇编程序使用基于标点的前缀,如
%
$
来区分二进制和十六进制,例如例如,其他人使用后缀

我的建议是:选择一个与运算符集中的任何字符都不匹配的前缀字符,例如
$
'
,或者选择一个小的双字符前缀,例如
0b
,以指示二进制数。然后在代码中,您只需查找该前缀字符并使用不同的解析循环即可处理二进制常量。例如,如果选择了
$

if (currentChar == '$')
    token = _getBinary( ++currentChar, expression );
else
    ... rest of code;
然后

Token::pointer_type Tokenizer::_get_binary( Tokenizer::string_type::const_iterator& currentChar, Tokenizer::string_type const& expression )
{
    Integer::value_type const MAX_UNSIGNED_D2 = std::numeric_limits<Integer::value_type>::max()-1)/2;
    Integer::value_type accumulator = *currentChar++ - '0';

    while ((*currentChar == '0' || *currentChar == '1') && accumulator <= MAX_UNSIGNED_D2)
         accumulator = accumulator * 2 + *currentChar++ - '0';

    return make<Integer>( accumulator );
}
Token::pointer\u type标记器::\u get\u binary(标记器::string\u type::const\u iterator¤tChar,标记器::string\u type const&expression)
{
整型::值类型常量MAX\u无符号\u D2=std::数值限制::MAX()-1)/2;
整数::值_类型累加器=*currentChar++-'0';

而((*currentChar='0'|*currentChar=='1')&&acculator使用
assert
进行简单的错误检查并不是一个好主意,因为如果断言失败,它将立即中止您的程序。对于标记器,您可能希望在出现单个错误后继续(例如,跳到标记分隔符并尝试从此处继续解析).在计算机中,所有数字都是以二进制表示的…二进制、十六进制、十进制、八进制等格式只是向正在读取数字的人表示数字。要检查以二进制表示数字的人工输入,只需检查所有字符是否为1或0,尽管他们最好需要一些数字o告诉程序他们将输入二进制,因为1001可以是十进制的1001,也可以是二进制的9。巧合的是,我刚刚完成了一个表达式解析器/编译器的编写。在我的实现中,所有值都是浮点值,所以当标记器到达一个不属于运算符的字符时,它调用
strod()
在它上面。如果
strtod
使用字符,它会为它生成一个文本,否则它会被视为一个标识符。我如何使它的前缀为0b?我在过去几个小时里一直在努力让它正常工作,我不断收到内存错误。好吧,你需要查看接下来的两个字符以确保它们是
0
b
,然后将指向第三个字符的指针传递给执行二进制解释的例程。要完成检查,在执行这些测试之前,还需要确保剩余字符串的长度至少为3个字符。