我正在创建一个中缀表达式解析器,所以我必须创建一个tokenizer.它运作良好,除了一件事:我现在不知道如何区分负数和" - "运算符.
例如,如果我有:
23 / -23
Run Code Online (Sandbox Code Playgroud)
该标记应该是23,/和-23,但如果我有这样的表达
23-22
Run Code Online (Sandbox Code Playgroud)
那么代币应该是23,-和22.
我找到了一个肮脏的解决方法,如果我遇到一个" - "后跟一个数字,我看看前面的字符,如果这个字符是数字或')',我把" - "视为一个操作符而不是数.除了有点难看之外,它不适用于像
--56
Run Code Online (Sandbox Code Playgroud)
它得到了如下的标记:-和-56它应该得到--56
有什么建议吗?
我正在从 glibc 读取“strlen”源代码,开发人员发现加快它的技巧是读取 n 个字节,其中 n 是一个长字的大小,而不是在每次迭代时读取 1 个字节。
我假设一个长字有 4 个字节。
棘手的部分是函数读取的每个 4 字节的“块”都可以包含一个空字节,因此在每次迭代时,函数必须检查块中是否有空字节。他们这样做
if (((longword - lomagic) & ~longword & himagic) != 0) { /* null byte found */ }
Run Code Online (Sandbox Code Playgroud)
哪里longword是数据块,himagic和lowmagic是神奇的值,定义为:
himagic = 0x80808080L;
lomagic = 0x01010101L;
Run Code Online (Sandbox Code Playgroud)
这是对这些值的评论
/* Bits 31, 24, 16, and 8 of this number are zero. Call these bits
the "holes." Note that there is a hole just to the left of
each byte, with an extra at …Run Code Online (Sandbox Code Playgroud)