目标是控制允许哪些类型的用户在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) 这里我有一个代码片段。
#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?我以前从未使用过位域,所以希望得到一些帮助。谢谢你。:)
所以,我有一个表示位域的字节数组。字节数组的任何索引处的位 1 意味着我有相应的部分,反之亦然。对于 0。现在,我需要将 0 的位值更改为 1,只要我有相应的部分。
我的问题是,如果我将字节数组转换为 int 数组,然后更改数组索引的相应值会更好,还是在字节数组中更简单?
如果是前者,如何将字节数组转换为整数数组?如果是后者,如何改变对应字节数组的值?
我需要从每个 24 位输入中解压缩两个 16 位值。(3 字节 -> 4 字节)。我已经按照 na\xc3\xafve 的方式做到了,但我对性能不满意。
\n例如,InBuffer 是__m128i:
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.\nRun Code Online (Sandbox Code Playgroud)\n解包后,值应存储在 __m256i 变量中。
\n我该如何使用 AVX2 解决这个问题?可能使用解包/洗牌/排列内在函数?
\n我有一组选项,一些正交(可以任意组合组合),一些独占(允许只允许一组),并需要选择一组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,...
我试图通过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)
所以现在我把它改成了: - …
我不知道该怎么称呼它,所以我不知道如何搜索它.
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)
我收集这涉及到一些事情,但我仍然不是一直都在理解.
在以下代码中
#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?
在查看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的语法定义列表中找不到它.
#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!有帮助吗?