相关疑难解决方法(0)

I can't manipulate bit fields in C

I wanted to implement LFSR(linear feedback shift registers) in C to generate random bits. When I try to modify an individual bit or just assign a short value to memory block, all the bits set to 1. How can I stop this from happening?

struct lfsr{
    //... 
    union{
        unsigned short ff_0 : 1;
        unsigned short ff_1 : 1;
        //... 
        unsigned short ff_f : 1;
        unsigned short ff;
    }flip_flops;
};

int main() {
    struct lfsr gen;
    gen.flip_flops.ff = 1;      //all the …
Run Code Online (Sandbox Code Playgroud)

c unions bit-fields

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

通过其地址访问C中的位字段

不允许使用其地址访问C中的位字段的原因是什么,是因为它可能不是一个非系统字对齐的地址..?或者因为在一个字节内得到位的地址没有意义......?(因为这种类型的指针运算会很尴尬吗?)

c pointers bit-fields

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

将4个整数打包成一个[10,10,10,2]整数

我正在将一些C++示例移植到Java

我现在卡住尝试将以下布局[10,10,10,2]中的四个整数打包成一个整数,这是第一个int占据前10位,类似于第二个和第三个,而最后一个只是最后两位.

在C++示例中,这是打包它们的代码:

GLM_FUNC_QUALIFIER uint32 packSnorm3x10_1x2(vec4 const & v)
    {
        detail::i10i10i10i2 Result;
        Result.data.x = int(round(clamp(v.x,-1.0f, 1.0f) * 511.f));
        Result.data.y = int(round(clamp(v.y,-1.0f, 1.0f) * 511.f));
        Result.data.z = int(round(clamp(v.z,-1.0f, 1.0f) * 511.f));
        Result.data.w = int(round(clamp(v.w,-1.0f, 1.0f) *   1.f));
        return Result.pack;
    }
Run Code Online (Sandbox Code Playgroud)

Result.data如下struct:

union i10i10i10i2
    {
        struct
        {
            int x : 10;
            int y : 10;
            int z : 10;
            int w : 2;
        } data;
        uint32 pack;
    };
Run Code Online (Sandbox Code Playgroud)

输入等于[-1f,-1f,0f,1f]我们得到Result.data等于[-511,-511,0,1]和返回值1074267649,二进制是:

        0                       -511 …
Run Code Online (Sandbox Code Playgroud)

c++ java bit-manipulation bit-shift bitwise-operators

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

在结构中混合位域

挂在关于位域的 geeksforgeeks 上,找到了这个例子:

#include <stdio.h>

struct test {
    unsigned int x;
    long int y : 33;
    unsigned int z;
};

int main() {
    struct test t;
    unsigned int *ptr1 = &t.x;
    unsigned int *ptr2 = &t.z;
    printf("%d", ptr2 - ptr1);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果,输出是 4。但为什么呢?x 占用 4 个字节,y - 8 和 z - 4。地址 x 和 z 的差异必须是 8?

c bit-fields

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

一次测试C中的所有位文件

假设我将C结构定义为

struct data {
    /* some memebers */

    int flag_a:1;
    int flag_b:1;
    int flag_c:1;

    /* some other members */
}
Run Code Online (Sandbox Code Playgroud)

有没有办法利用在内存中表示为单个int的位域,并将条件写s.flag_a | s.flag_b | s.flag_c为更简单的表达式,如s.flags

或者像GCC这样的智能编译器是否能够实际推断它?

编辑:为了让自己绝对清楚:我正在寻找一种可移植的方法来测试所有正在设置的标志,而无需单独显式地测试每个标志.

c

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

将char转换为4位的位字段条目

大家好我正面临另一个问题,我正在研究单个位并从ascii文本中提取数据.问题是编译器给出了一个错误,即将char(8位)转换为4位存储器字段可能会改变其值.

显然这是真的,但我怎么能克服这个错误呢?

typedef struct {
struct {
    unsigned int type:        4;
    unsigned int uid:         8;
    unsigned int operation:   4; 
    unsigned int reg:         16;
}header;
char *arg_nm;
} OWL_request;
Run Code Online (Sandbox Code Playgroud)

完整的错误:

 error: conversion to 'unsigned char:4' from 'char' may alter its value [-Werror=conversion]
Run Code Online (Sandbox Code Playgroud)

这是作业

request.header.type = (char)(j[0]-65);
Run Code Online (Sandbox Code Playgroud)

j*char

我要做的是在不改变编译器标志的情况下摆脱错误

c casting

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