小编use*_*449的帖子

计算乘数和除数值的优化算法

我正在尝试优化算法,我想不出更好的方法来做到这一点.

有一个输入(时钟频率值)将通过乘数和除数的组合.

  • 目标是在给定输入的情况下找到将产生所需输出值的乘数和除数值的集合.

OutClk =(InClk*Mult1*Mult2*Mult3*Mult4/Div1)/ Div2

我目前的(天真的?)实现是:

#define PRE_MIN 10000000
#define PRE_MAX 20000000

// Available values of the multipliers and divisors.
uint8_t mult1_vals[] = {1, 2};
uint8_t mult2_vals[] = {1, 2, 4, 8};
uint8_t mult3_vals[] = {3, 5, 7};
uint8_t div1_vals[] = {1, 2, 4};
uint8_t div2_vals[] = {1, 2, 4, 8};

bool exists_mults_divs(uint32_t in_val, uint32_t out_val)
{
    uint8_t i_m1, i_m2, i_m3, i_d1, i_d2;
    uint32_t calc_val;

    for (i_m1 = 0; i_m1 < sizeof(mult1_vals); i_m1++) {
    for (i_m2 = 0; i_m2 …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm optimization loops

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

给定位掩码,如何计算位移计数

我想要一个函数或(最好)一个宏来计算获得特定位掩码所需的移位数。

目前我正在做类似的事情:

#define CURRBITMASK 0x30
#define CURRBITSHIFT 4
Run Code Online (Sandbox Code Playgroud)

我想做的事:

#define BITMASK1 0x10
#define BITSHIFT1 GETSHIFT(BITMASK1) // 4 ; 0x10 = (0x1 << 4)

#define BITMASK2 0x18
#define BITSHIFT2 GETSHIFT(BITMASK2) // 3 ; 0x18 = (0x3 << 3)

#define BITMASK3 0xC0
#define BITSHIFT3 GETSHIFT(BITMASK3) // 6 ; 0xC0 = (0x3 << 6)

#define BITMASK4 0x40
#define BITSHIFT4 GETSHIFT(BITMASK3) // 6 ; 0x40 = (0x1 << 6)
Run Code Online (Sandbox Code Playgroud)

有没有什么方法可以仅使用宏从掩码中获取所需的移位?如果没有,是否有比这更优化的方法来将其作为函数来实现?:

int get_shift(int bitmask) {
    int count = 0;
    while (bitmask & 0x1) {
        bitmask …
Run Code Online (Sandbox Code Playgroud)

c macros c-preprocessor

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

无法在 Docker 容器内使用挂载

我正在尝试在 Docker 容器中执行以下操作:

docker run -it <image> bash
root$ dd if=/dev/zero of=file.fs bs=1024 count=1024
root$ mkfs.ext4 file.fs
root$ mkdir tmp
root$ mount -t ext4 file.fs tmp
**mount: tmp/: mount failed: Unknown error -1**
root$ dmesg
dmesg: read kernel buffer failed: Operation not permitted
Run Code Online (Sandbox Code Playgroud)

上面的相同命令(使用 sudo)在我的主机上运行良好。

如何在 Docker 容器中成功挂载?

mount docker

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

C宏在一个范围内运行循环

我有一个包含 10个元素的数组.一个任意的功能是元素被调用.

每个任意函数都可以

  1. 在单个元素上操作,或
  2. 相同的功能将对所有元素起作用.

我有各种遵循这种模式的功能.

我正在尝试这样做:

#define ITERATE_ALL10(IDX) (##IDX = 0; ##IDX < 10; ##IDX++)

int arbitrary_fx(int *some_arr, int id) {
    int i;

    if (id == ID_ALL) {
        for (ITERATE_ALL10(i)) {
            arbitrary_fx_helper(some_arr[id]);
        }
    }
    else {
        arbitrary_fx_helper(some_arr[id]);
    }
}
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何修复错误:

expected ';' before ')' token
Run Code Online (Sandbox Code Playgroud)

expected expression before ')' token
Run Code Online (Sandbox Code Playgroud)

我做错了什么?有没有更好的方法来实现我想要的?

c macros c-preprocessor

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

标签 统计

c ×2

c-preprocessor ×2

macros ×2

algorithm ×1

c++ ×1

docker ×1

loops ×1

mount ×1

optimization ×1