使用此矩阵和向量表示,有助于以这种方式进行矩阵乘法:
(col 1 ... col 8)*(v 1 ... v 8)T = col 1*v 1 + ... + col 8*v 8
矩阵A =(col 1 ... col 8)
和列向量v =(v 1 ... v 8)T
进一步考虑这一点,如果通过重复每一位8次然后计算将8位向量扩展为64位向量,则可以立即进行所有乘法运算P = A & v_inflated.唯一剩下的就是产品的添加(即异或).
对产品进行异或的简单方法是.
uint64_t P = calculated products from text above;
uint64_t sum = 0;
for( int i = 8; i; --i )
{
sum ^= P & 0xFF;
P >> 8;
}
Run Code Online (Sandbox Code Playgroud)
你只有256个载体!使用查找表生成正确的位掩码,然后你的逻辑将是这样的
output_bit_n = bool (matrix [n] & lookup [vector])
Run Code Online (Sandbox Code Playgroud)
换句话说,您的查找表可以将8位值转换为64位世界.
如果编译器不够智能以进行优化,您可以使用rotate-with-carry指令将其有效地打包到结果中(value<<=1)|=result.
| 归档时间: |
|
| 查看次数: |
3076 次 |
| 最近记录: |