标签: bit-fields

需要元编程魔术来以无错误的方式定义位字段的母体

目标是控制允许哪些类型的用户在UI级别执行哪些操作.这段代码已经存在了一段时间; 我只想稍微改进一下.我试图改进的文件可能应该是自动生成的,但是这个变化太大了,所以我寻求一个更简单的解决方案.

我们将调用的文件PermissionBits.h有一堆这样的:

// Here names are mangled; for example XYZ_OP_A is:
// permission to operation A in category/context XYZ
// SCU64 = static const unsigned __int64
// Some namespaces utilize all 64 bits
// The actual values (as long as they are proper bit fields) 
// do not matter - they are always used by name
namespace XYZPermissionBits
{
    SCU64 XYZ_OP_A = 1UI64 <<  0; //    1 = 0x0000000000000001
    SCU64 XYZ_OP_B = 1UI64 <<  1; //    2 …
Run Code Online (Sandbox Code Playgroud)

c++ macros metaprogramming bit-fields

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

具有位域的结构的大小

这里我有一个代码片段。

#include <stdio.h>
int main()
{
    struct value
    {
        int bit1 : 1;
        int bit2 : 4;
        int bit3 : 4;
    } bit;

    printf("%d",sizeof(bit));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出为 4(32 位编译器)。谁能解释我怎么做?为什么不是 1+ 4 + 4 = 9?我以前从未使用过位域,所以希望得到一些帮助。谢谢你。:)

c bit-fields

3
推荐指数
2
解决办法
1325
查看次数

处理表示位域的字节数组中位的有效方法

所以,我有一个表示位域的字节数组。字节数组的任何索引处的位 1 意味着我有相应的部分,反之亦然。对于 0。现在,我需要将 0 的位值更改为 1,只要我有相应的部分。

我的问题是,如果我将字节数组转换为 int 数组,然后更改数组索引的相应值会更好,还是在字节数组中更简单?

如果是前者,如何将字节数组转换为整数数组?如果是后者,如何改变对应字节数组的值?

java bit-manipulation bit-fields

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

SIMD 将 12 位字段解包为 16 位

我需要从每个 24 位输入中解压缩两个 16 位值。(3 字节 -> 4 字节)。我已经按照 na\xc3\xafve 的方式做到了,但我对性能不满意。

\n

例如,InBuffer 是__m128i

\n
value1 = (uint16_t)InBuffer[0:11]        // bit-ranges\nvalue2 = (uint16_t)InBuffer[12:24]\n\nvalue3 = (uint16_t)InBuffer[25:36] \nvalue4 = (uint16_t)InBuffer[37:48]\n... for all the 128 bits.\n
Run Code Online (Sandbox Code Playgroud)\n

解包后,值应存储在 __m256i 变量中。

\n

我该如何使用 AVX2 解决这个问题?可能使用解包/洗牌/排列内在函数?

\n

c avx pixelformat bit-fields avx2

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

如何选择bitflag值?

我有一组选项,一些正交(可以任意组合组合),一些独占(允许只允许一组),并需要选择一组enum值,以便它们可以按比特组合or并提取有点位and.我希望 - or无效组合是可检测的.

有没有像这样生成的工具enums

编辑清晰

我正在寻找能够利用某些标志组合无效以减少使用的位数的事实.我能够检测错误的要求是软的.如果事情被破坏,我不需要能够告诉我们使用了什么.

我正在使用C#,但任何解决方案都应该有用.

一个示例模式是:

0011 00
0101 00
1001 00
0110 00
1010 00
1100 00

0000 01
0000 10
Run Code Online (Sandbox Code Playgroud)

获得6个独占标志和一个2到6位的正交对

快速测试表明,5位给出9个值,6位给出20,...

language-agnostic code-generation bitflags bit-fields

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

将位字段读取强制为32位

我试图通过PCI总线读取低于32位的读取到VME桥接芯片(Tundra Universe II),然后将其转移到VME总线并由目标接收.

目标VME应用程序仅接受D32(数据宽度读取为32位)并将忽略其他任何内容.

如果我使用在VME窗口上映射的位字段结构(nmap'd到主存储器中),我可以读取> 24位的位字段,但是任何不足都会失败.即: -

struct works {
    unsigned int a:24;
};

struct fails {
    unsigned int a:1;
    unsigned int b:1;
    unsigned int c:1;
};

struct main {
    works work;
    fails fail;
}
volatile *reg = function_that_creates_and_maps_the_vme_windows_returns_address()
Run Code Online (Sandbox Code Playgroud)

这表明,结构工程,读为32位,但一读通过失败的结构对如REG-> fail.a是越来越因素下读取X位.(其中X可能是16或8?)

所以问题是:
a)这缩小了哪里?编译器?OS?还是Tundra芯片?
b)执行的读操作的实际大小是多少?

我基本上想排除芯片以外的一切.关于它的文档是在网上,但如果可以证明通过PCI总线请求的数据宽度是32位,那么问题可归咎于Tundra芯片!

编辑: -
具体的例子,代码是: -

struct SVersion
{
    unsigned title         : 8;
    unsigned pecversion    : 8;
    unsigned majorversion  : 8;
    unsigned minorversion  : 8;
} Version;
Run Code Online (Sandbox Code Playgroud)

所以现在我把它改成了: - …

c c++ bit bit-fields

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

这个C语法是什么?

我不知道该怎么称呼它,所以我不知道如何搜索它.

unsigned int odd : 1;

编辑:

详细说明,它来自这个片段:

struct bitField {
    unsigned int odd : 1;
    unsigned int padding: 15; // to round out to 16 bits
};
Run Code Online (Sandbox Code Playgroud)

我收集这涉及到一些事情,但我仍然不是一直都在理解.

c bit-fields

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

位字段操作

在以下代码中

#include <iostream>

using namespace std;
struct field
{
   unsigned first : 5;
   unsigned second : 9;
};
int main()
{
   union
   {
      field word;
      int i;
   };
   i = 0;
   cout<<"First is : "<<word.first<<" Second is : "<<word.second<<" I is "<<i<<"\n";
   word.first = 2;
   cout<<"First is : "<<word.first<<" Second is : "<<word.second<<" I is "<<i<<"\n";
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我初始化word.first = 2时,正如预期的那样,它会更新该字的5位,并提供所需的输出.这是'i'的输出有点令人困惑.使用word.first = 2,我将输出设为2,当我执行word.second = 2时,i的输出为64.因为,它们共享相同的内存块,在后一种情况下,输出(对于i)不应该是2?

c++ bit-fields

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

什么:在C中意味着什么?

在查看QEMU的源包时,我在exec.c文件中找到:

struct PhysPageEntry {
    /* How many bits skip to next level (in units of L2_SIZE). 0 for a leaf. */
    uint32_t skip : 6;
     /* index into phys_sections (!skip) or phys_map_nodes (skip) */
    uint32_t ptr : 26;
};
Run Code Online (Sandbox Code Playgroud)

我想知道:运算符意味着什么.我在C的语法定义列表中找不到它.

c struct qemu bit-fields

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

为什么为这段代码打印-1,我认为当bit-field设置为1时它是1?

#include<stdio.h>  
int main()  
{  
    struct byte  
    {  
        int one:1;  
    };

    struct byte var = {1};  // statement A
    printf("%d", var.one);  
    return 0;  
}  
Run Code Online (Sandbox Code Playgroud)

在这里,我想我们已经将整数变量'one'的位存储器限制为1,即; 它只能存储0和1而在'语句A'我们用'1'初始化了这个变量,这应该没问题,因为'one'仍然可以在其内存中保留一点但是它在控制台上打印-1!有帮助吗?

c bit-fields

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