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中的位字段的原因是什么,是因为它可能不是一个非系统字对齐的地址..?或者因为在一个字节内得到位的地址没有意义......?(因为这种类型的指针运算会很尴尬吗?)
我现在卡住尝试将以下布局[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) 挂在关于位域的 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结构定义为
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这样的智能编译器是否能够实际推断它?
编辑:为了让自己绝对清楚:我正在寻找一种可移植的方法来测试所有正在设置的标志,而无需单独显式地测试每个标志.
大家好我正面临另一个问题,我正在研究单个位并从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
我要做的是在不改变编译器标志的情况下摆脱错误