相关疑难解决方法(0)

如何使用shift/add/sub除以9?

上周我接受了采访,有一个这样的测试:

使用SHIFT LEFT,SHIFT RIGHT,ADD,SUBSTRACT指令计算N/9(给定N为正整数) .

algorithm assembly cpu-architecture integer-arithmetic

8
推荐指数
1
解决办法
1106
查看次数

将74位整数转换为基数31

要生成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即使是干杯和赫斯,我终于完成了一堂课.- 阿尔夫的解决方案就像一个魅力

c++ base-conversion bigint c++11 std-bitset

6
推荐指数
1
解决办法
578
查看次数

ARM中如何做除法?

我试图找到如何在 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。所以我的结果不太准确。

assembly arm division

5
推荐指数
1
解决办法
5万
查看次数

如何优化DivMod的常数除数为10

在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)

delphi x86 inline-assembly micro-optimization

5
推荐指数
2
解决办法
358
查看次数

不使用%和/运算符的5的可分性

如何在不使用%和/运算符的情况下检查数字是否可被5整除. 我想要一个最快的算法来解决这个问题.

c algorithm

4
推荐指数
2
解决办法
2708
查看次数

C - 针对模数的按位运算的算法,对于非2的幂次数

我知道可以使用按位运算符计算2的幂的模数

  x % 2^n == x & (2^n - 1).
Run Code Online (Sandbox Code Playgroud)

但我想知道是否存在任何广义的按位算法,以找出任何数的模数不是2的幂.例如,

 7%5 
Run Code Online (Sandbox Code Playgroud)

先感谢您.

c bit-manipulation bitwise-operators

4
推荐指数
2
解决办法
667
查看次数

整数除法还是浮点乘法?

如果必须计算给定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 $将不再值得吗?

c++ optimization

3
推荐指数
1
解决办法
5272
查看次数

优化:昂贵的分支与廉价的比较

这是一篇很好的文章,讨论了低级优化技术,并展示了一个例子,即作者将昂贵的部门转换为廉价的比较. 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++ optimization caching branch-prediction

2
推荐指数
1
解决办法
2094
查看次数

将秒和纳秒转换为微秒的最快(最佳时间)方式

我想在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上运行.我还没有真正测试过算术运算的性能,我只是想知道它是否会影响性能,是否有办法改进它.

c timer

0
推荐指数
1
解决办法
131
查看次数