小编Pgr*_*rAm的帖子

使用位移重新实现模数?

我正在为一个非常有限的系统编写一些代码,其中mod运算符非常慢.在我的代码中,模数需要每秒使用大约180次,并且我认为尽可能地删除它会显着提高代码的速度,因为现在我的主循环的一个循环不会在1/60的情况下运行应该是第二个.我想知道是否有可能仅使用乘法和除法可能的位移来重新实现模数.所以这是我目前在c ++中的代码(如果我可以使用汇编执行模数,那就更好了).如何在不使用除法或乘法的情况下删除模数?

    while(input > 0)
{
    out = (out << 3) + (out << 1);
    out += input % 10;

    input = (input >> 8) + (input >> 1);
}
Run Code Online (Sandbox Code Playgroud)

编辑:其实我意识到我需要每秒超过180次.看作输入值可以是一个非常大的数字,最多40位数.

c++ optimization bit-manipulation bit-shift modulo

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

仅使用数组的一部分

我有一个动态分配的float数组,我需要将此数组作为参数传递给三个不同的函数,但每个函数需要获得不同的数组范围.有没有什么方法可以将带有元素0到23的数组发送到一个函数,将元素24到38发送到另一个函数,将元素39到64发送到第三个函数.

在某些语言中(比如python,我认为)你可以这样做:

somefunction(my_array[0:23]);
somefunction(my_array[24:38]);
somefunction(my_array[39:64]);
Run Code Online (Sandbox Code Playgroud)

但是我使用的是c ++,我不知道在c ++中有什么方法可以做到这一点.

有人知道怎么做这个吗?

somefunction(); 是一个API函数,所以我不能修改它所需的参数.

c++ arrays

10
推荐指数
4
解决办法
3万
查看次数

我的汇编代码有什么问题

所以我正在用C++编写一个用于MS-DOS的游戏,我还包括一些用于速度的内联汇编.这个特殊的代码块会将一个星形画入视频存储器(0A000h).我的代码的问题是它只绘制了dh所设置的任何颜色的一个像素.据我所知mov dx,00007h相当于将dh设置为0,dl设置为7.有什么问题?

每行旁边都注释了等效的C/C++代码(或者至少是我的意图).我的编译器是turbo C++ 3.0.我试图只使用8086/8088指令.

另外我知道MS-DOS有多老,所以不要告诉我为更新的编译器/操作系统编写代码.为dos编写代码是我的一种爱好.

pixelOffset = x + (y << 6) +  (y << 8);

_asm {
    mov  ax, WORD PTR pixelOffset
    mov  di, ax
    mov  ax, 0A000h         ;pointer to the video memory
    mov  es, ax
    mov  dx, 00007h         ;indexed color 00 and 07
    mov  cx, 0000Fh         ;indexed color white 0F
    add  ax, 2              ;pixelOffset += 2;
    mov  es:[di], dh        ;videomem[pixelOffset] = BLACK;
    add  ax, 319            ;pixelOffset += 319;
    mov  es:[di], dh        ;videomem[pixelOffset] = BLACK;
    add  ax, 1 …
Run Code Online (Sandbox Code Playgroud)

c++ x86 assembly dos x86-16

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

没有64位临时的定点乘法

嗨我正在为嵌入式系统实现一些定点数学的东西,我正在尝试将两个16.16定点数相乘而不创建一个64位临时数.到目前为止,我提出的代码生成的指令最少.

int multiply(int x, int y){
    int result;
    long long temp = x;
    temp *= y;
    temp >>= 16;
    result = temp;
    return result;
}
Run Code Online (Sandbox Code Playgroud)

这段代码的问题在于它使用了一个临时的64位整数,这似乎会产生错误的汇编代码.我正在尝试制作一个使用两个32位整数而不是64位整数的系统.有人知道怎么做吗?

c optimization fixed-point

4
推荐指数
1
解决办法
2711
查看次数

课程相互依赖

考虑这些c ++片段:

foo.h中:

class foo
{
bar myobj;
};
Run Code Online (Sandbox Code Playgroud)

bar.h:

class bar
{
foo *yourobj;
};
Run Code Online (Sandbox Code Playgroud)

其他档案:

#include "foo.h" //because foo.h is included first bar will not be defined in foo.h
#include "bar.h"

foo container;

bar blah;
Run Code Online (Sandbox Code Playgroud)

我知道我没有费心去编写构造函数,但是你得到了这个想法.有人知道解决这种情况的方法吗?

c++ oop class

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

标签 统计

c++ ×4

optimization ×2

arrays ×1

assembly ×1

bit-manipulation ×1

bit-shift ×1

c ×1

class ×1

dos ×1

fixed-point ×1

modulo ×1

oop ×1

x86 ×1

x86-16 ×1