这里非常具体的问题......并且这不是作业(离开那么远......远远落后)。基本上我需要为写入EPROM的代码计算校验和,我想在Ada程序中编写这个函数来练习用语言进行位操作。
我正在更改EPROM的固件数据文件的一部分,并且该更改需要在结尾处使用新的有效校验和,以便生成的系统将接受更改的代码。这个校验和的开始是对它所覆盖的所有数据进行模256的二进制求和,然后进行其他更高级别的操作以得到我不会在这里进入的校验和。
那么现在如何在mod类型上进行二进制加法?
我假设如果我在mod类型上使用“+”运算符,它将被归类为整数值运算...我不想要的结果。我真的很难过这个。如果我不需要,我不想真正做一个打包数组并执行比特携带,特别是如果那被认为是“老帽子”。我正在阅读的参考文献声称,在处理二进制操作时,您需要使用mod类型来确保更可移植的代码。如果可能,我想尝试一下。我试图用这个程序来定位多个平台,所以我正在寻找可移植性。
有人可以建议我如何在mod类型上执行二进制加法吗?
语言中的任何起始位置都会有很大帮助。
答案 0 :(得分:5)
只需使用modular type,运算符为其执行无符号算术。
type Word is mod 2 ** 16; for Word'Size use 16;
附录:对于模块类型,预定义的logical operators逐位运行。此外,“模块类型的binary adding operators + and –包括模数的最终减少量,如果结果超出类型的基础范围。” function Update_Crc
就是一个例子。
附录:§3.5.4 Integer Types, ¶19注意到对于模块类型,predefined operators的结果以模数减少,包括binary adding operators + and –。此外,§B.2 The Package Interfaces中的移位功能可用于模块化类型。总之,算术,逻辑和移位功能足以满足大多数按位操作。