C语言 将位从一个变量复制到另一个变量,并使用LUT交换位

aydmsdu9  于 2023-01-25  发布在  其他
关注(0)|答案(1)|浏览(118)

在C语言中,我想用来自16位变量“c”的位来填充两个8位变量“a”和“b”。16位变量中的位被混洗而没有任何逻辑顺序,其可以是例如:
答四|b.2款|b.6|b.0版本|a.零|答七|答六|b.1类|b.2款|b.7|b.4|答五|a.一|答二|b.3款|b.5
有没有办法做到这一点?目标是有一个相当可行的查找表。

disbfnqx

disbfnqx1#

此代码在复制initial后随机化和混洗c中的位,您声明它旨在用于嵌入式系统,但您没有提供任何信息说明它是哪个嵌入式系统,它可能是一个arduino,它可能是一个80年代的晦涩系统,它可能是一个diy pcb,附带一个随机stm32,我们无法知道:)

// Code is under public domain, use it like what you want
#include <stdio.h>
#include <stdint.h>
#include <stddef.h>
#include <time.h>

int main() {
    srand(time(NULL));
    uint16_t initial = 4040; /* 24 will be shuffled */
    uint16_t c = 0;
    
    
    /* shuffle bits */
    for(unsigned i = 0; i < sizeof(uint16_t) * 8; ++i) {
        c ^= initial & (1 << (rand() % 16));
    }
    
    uint8_t a = 0;
    uint8_t b = 0;


    a = ((unsigned char*)&c)[0];
    b = ((unsigned char*)&c)[1];
    
    for(unsigned char i = 0; i < sizeof(uint16_t) * 8; ++i) {
        printf("%c.%d = %d | ", ('a' * ((i < 8))) + ('b' * ((i >= 8))), ((i + 1) * (i < 8)) + ((i + 1 - 8) * (i >= 8)), ((a >> i)) & 1);
    }
    

    return 0;
}

这段代码将打印以下内容(显然你的代码将是随机的):
a.1 = 1|a.2 = 0|a.3 = 1|a.4 = 1|a.5 = 0|a.6 = 1|a.7 = 1|a.8 = 1|b.1 = 0|b.2 = 0|b.3 = 0|b.4 = 1|b.5 = 0|b.6 = 1|b.7 = 0|b.8 = 0|

相关问题