上周我接受了采访,有一个这样的测试:
使用SHIFT LEFT,SHIFT RIGHT,ADD,SUBSTRACT指令计算N/9(给定N为正整数)
.
要生成UFI编号,我使用bitset大小为74.要执行UFI生成的第2步,我需要转换此数字:
9 444 732 987 799 592 368 290
(10000000000000000000000000000101000001000001010000011101011111100010100010)
Run Code Online (Sandbox Code Playgroud)
成:
DFSTTM62QN6DTV1
Run Code Online (Sandbox Code Playgroud)
通过将第一个表示转换为基数31并从表中获取等效的字符.
#define PAYLOAD_SIZE 74
// payload = binary of 9444732987799592368290
std::bitset<PAYLOAD_SIZE> bs_payload(payload);
/*
perform modulo 31 to obtain:
12(D), 14(F), 24(S), 25(T), 25, 19, 6, 2, 22, 20, 6, 12, 25, 27, 1
*/
Run Code Online (Sandbox Code Playgroud)
有没有办法在不使用外部BigInteger库的情况下对我的bitset执行转换?
编辑:BigInteger即使是干杯和赫斯,我终于完成了一堂课.- 阿尔夫的解决方案就像一个魅力
我试图找到如何在 ARM 中进行除法,因为没有DIV命令。如果这可以通过浮点数的乘法[/9 = *0.09]、减法或使用库来完成。任何方式都可以。
目前我正在使用像这样的循环使用减法进行除法,但我丢失了小数:
MOV R0,#70 ;Fahrenheit Temperature
SUB R1,R0,#32 ; Subtracting 32
MOV R4,#0 ;Counter
LOOP
ADD R4,R4,#1; Counter+1 ->Is the answer of the division without decimals
SUB R1,#9
CMP R1,#0
BPL LOOP
MOV R1,R4
Run Code Online (Sandbox Code Playgroud)
所以基本上我所做的是,我的温度为 70,我减去 32,得到 38。然后在循环中我每次取 9,直到提醒小于 9。使用正常除法的答案是 4.22222。这里我得到 5。所以我的结果不太准确。
在Delphi的math.pas单元中有一个DivMod程序,我希望将其转换为内联并优化它,除数总是为10.但我不知道五角大楼ASM的细节.波纹管程序的转换是什么?
procedure DivMod(Dividend: Integer; Divisor: Word;
var Result, Remainder: Word);
asm
PUSH EBX
MOV EBX,EDX
MOV EDX,EAX
SHR EDX,16
DIV BX
MOV EBX,Remainder
MOV [ECX],AX
MOV [EBX],DX
POP EBX
end;
Run Code Online (Sandbox Code Playgroud) 我知道可以使用按位运算符计算2的幂的模数
x % 2^n == x & (2^n - 1).
Run Code Online (Sandbox Code Playgroud)
但我想知道是否存在任何广义的按位算法,以找出任何数的模数不是2的幂.例如,
7%5
Run Code Online (Sandbox Code Playgroud)
先感谢您.
如果必须计算给定int值的一小部分,请说:
int j = 78;
int i = 5* j / 4;
Run Code Online (Sandbox Code Playgroud)
这比做的更快:
int i = 1.25*j; // ?
Run Code Online (Sandbox Code Playgroud)
如果是,是否存在可用于决定使用哪个转换因子的转换因子,例如int可以在同一时间内进行多次除法一次float乘法?
编辑:我认为评论清楚表明浮点数学会慢一点,但问题是,多少?如果我需要float用$ N $ intdiv 替换每个乘法,那么$ N $将不再值得吗?
这是一篇很好的文章,讨论了低级优化技术,并展示了一个例子,即作者将昂贵的部门转换为廉价的比较. https://www.facebook.com/notes/facebook-engineering/three-optimization-tips-for-c/10151361643253920
对于那些不想点击的人,基本上他转换了这个:
uint32_t digits10(uint64_t v) {
uint32_t result = 0;
do {
++result;
v /= 10;
} while (v);
return result;
}
Run Code Online (Sandbox Code Playgroud)
进入:
uint32_t digits10(uint64_t v) {
uint32_t result = 1;
for (;;) {
if (v < 10) return result;
if (v < 100) return result + 1;
if (v < 1000) return result + 2;
if (v < 10000) return result + 3;
// Skip ahead by 4 orders of magnitude
v /= 10000U;
result += 4;
} …Run Code Online (Sandbox Code Playgroud) 我想在C中编写函数,需要几秒和几纳秒作为输入.将秒和纳秒转换为微秒,以微秒为单位返回总数.
unsigned long long get_microseconds(int seconds, unsigned long long nSeconds);
Run Code Online (Sandbox Code Playgroud)
现在转换非常简单.我可以使用以下公式 -
mSeconds =秒*1000000 + nSeconds/1000(纳秒转换精度损失不错,我的计时器无论如何最小分辨率为100微秒)
如果不使用乘法和除法运算符来获得最佳精度和最小数量的cpu周期,那么实现此等式的最快方法是什么.
编辑:我正在使用基于GNU但定制设计的工具链的自定义DSP上运行.我还没有真正测试过算术运算的性能,我只是想知道它是否会影响性能,是否有办法改进它.