我正在寻找一种方法来表示值范围:0 - 18446744073709551615使用少于8个字节.
我试着想一些可以做到的方法,但没有任何作用.理论上,例如:使用单个字节表示至少2个字节的位序列.但是,2个字节具有65536个不同的位组合,而单个字节仅给出0-255(256个组合)的值范围.
最好的方法可能是改变位的含义.那没关系,但不能有任何精确损失.
我开始认为它根本不可能,但我希望得到其他人关于这个问题的意见和理论.
有两个规则:#1不能有任何精度损失(即,所有数字0 - 18446744073709551615必须是可表示的).#2从标准64位格式转换永远不会导致需要超过7个字节(56位).
这些规则使这一点特别困难.
我想尽可能地优化我的函数,我做的一件事就是使用r8作为指针,因为这是指针在x64函数中被推入的寄存器.
但是推送RSI或RDI,将指针移动到它们并在循环中更快地使用它们?
例如,mov [RSI],DL;将编译为2个字节和:mov [r8],DL; 将编译为3个字节
所以,如果我做了100到200次循环,r8会因为要解码的额外字节而变慢吗?或推动RSI并移动指针消除任何可能的速度增加?显然push和mov会在循环外发生.