我已经看到这种模式在C&C++中使用了很多.
unsigned int flags = -1; // all bits are true
Run Code Online (Sandbox Code Playgroud)
这是一个很好的便携式方法吗?或正在使用0xffffffff或~0更好?
我在Quora帖子中看到了以下代码:
#include <stdio.h>
struct mystruct { int enabled:1; };
int main()
{
struct mystruct s;
s.enabled = 1;
if(s.enabled == 1)
printf("Is enabled\n"); // --> we think this to be printed
else
printf("Is disabled !!\n");
}
Run Code Online (Sandbox Code Playgroud)
在C&C++中,代码的输出都是意外的,
被禁用 !!
虽然在那篇文章中给出了"符号位"相关的解释,但是我无法理解,我们如何设置某些内容然后它没有反映出来.
有人可以给出更详细的解释吗?
c c++ bit-fields signed-integer implementation-defined-behavior
我有一个结构,我需要填充和写入磁盘(实际上几个).
一个例子是:
byte-6
bit0 - original_or_copy
bit1 - copyright
bit2 - data_alignment_indicator
bit3 - PES_priority
bit4-bit5 - PES_scrambling control.
bit6-bit7 - reserved
Run Code Online (Sandbox Code Playgroud)
在CI中可能会执行以下操作:
struct PESHeader {
unsigned reserved:2;
unsigned scrambling_control:2;
unsigned priority:1;
unsigned data_alignment_indicator:1;
unsigned copyright:1;
unsigned original_or_copy:1;
};
Run Code Online (Sandbox Code Playgroud)
有没有办法在C#中做到这一点,使我能够使用struct dereferencing点运算符访问位?
对于几个结构,我可以在访问器函数中进行包裹移位.
我有很多结构要以这种方式处理,所以我正在寻找一些更容易阅读和更快写的东西.
我正在研发一个只有2KB SRAM的微控制器,并且迫切需要节省一些内存.试图找出如何使用位域将8 0/ 1值放入单个字节但不能完全解决的问题.
struct Bits
{
int8_t b0:1, b1:1, b2:1, b3:1, b4:1, b5:1, b6:1, b7:1;
};
int main(){
Bits b;
b.b0 = 0;
b.b1 = 1;
cout << (int)b.b0; // outputs 0, correct
cout << (int)b.b1; // outputs -1, should be outputting 1
}
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?
可能重复:
这个C++代码是什么意思?
我正在尝试使用JNA将C结构映射到Java.我遇到了一些我从未见过的东西.
该struct定义如下:
struct op
{
unsigned op_type:9; //---> what does this mean?
unsigned op_opt:1;
unsigned op_latefree:1;
unsigned op_latefreed:1;
unsigned op_attached:1;
unsigned op_spare:3;
U8 op_flags;
U8 op_private;
};
Run Code Online (Sandbox Code Playgroud)
你可以看到一些变量被定义为unsigned op_attached:1,我不确定这意味着什么.这会影响为这个特定变量分配的字节数吗?
任何使用位域的可移植代码似乎都区分了小端和大端平台.有关此类代码的示例,请参阅linux内核中struct iphdr的声明.我无法理解为什么位字节序是一个问题.
据我所知,bitfields纯粹是编译器构造,用于促进位级操作.
例如,考虑以下位域:
只是一种简洁易懂的说法
struct ParsedInt {
unsigned int f1:1;
unsigned int f2:3;
unsigned int f3:4;
};
uint8_t i;
struct ParsedInt *d = &i;
d->f2.
但是,无论架构如何,位操作都是明确定义的并且可以正常工作.那么,bitfields怎么不便携?
是否值得使用C的位域实现?如果是的话,什么时候使用?
我正在查看一些仿真器代码,看起来芯片的寄存器没有使用位字段实现.
这是出于性能原因(或其他原因)而避免的吗?
是否仍然使用位字段?(即固件放在实际芯片上等)
我需要一个布尔数组的紧凑表示,Python有内置的位域类型还是我需要找到一个替代解决方案?
以下C++代码是什么意思?
unsigned char a : 1;
unsigned char b : 7;
Run Code Online (Sandbox Code Playgroud)
我猜它会创建两个char a和b,并且它们都应该是一个字节长,但我不知道":1"和":7"部分是做什么的.
可能重复:
'unsigned temp:3'表示什么
我正在学习一些内核代码,并且出现在以下行中(在linux 2.4中,sched.h,struct mm_struct):
unsigned dumpable:1;
Run Code Online (Sandbox Code Playgroud)
这是什么意思?
bit-fields ×10
c ×7
c++ ×6
colon ×2
binary ×1
bitarray ×1
c# ×1
implementation-defined-behavior ×1
low-level ×1
portability ×1
python ×1