标签: bit-fields

在Python中进行位域操作的最佳方法是什么?

我正在通过UDP读取一些MPEG传输流协议,它有一些时髦的位域(例如长度为13).我正在使用"struct"库来进行广泛的解包,但有一种简单的方法可以说"抓住下一个13位"而不必手动调整位操作吗?我想要像C做位字段的方式(不必回复到C).

建议?

python bits udp bit-fields

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

在C中是否有一个相当于sizeof()的东西?

应用于位域时,Sizeof()不起作用:

# cat p.c
  #include<stdio.h>
  int main( int argc, char **argv )
  {
    struct { unsigned int bitfield : 3; } s;
    fprintf( stdout, "size=%d\n", sizeof(s.bitfield) );
  }
# gcc p.c -o p
  p.c: In function ‘main’:
  p.c:5: error: ‘sizeof’ applied to a bit-field
Run Code Online (Sandbox Code Playgroud)

......显然,因为它无法返回浮点部分大小或其他东西.然而,它提出了一个有趣的问题.在C中是否有一个等价物来告诉你变量/类型中的位数?理想情况下,除了位域之外,它也适用于常规类型,如charint.

更新:

如果对于位域没有相当于sizeof()的语言,那么计算它的最有效方法是什么 - 在运行时!想象一下,你有依赖于此的循环,如果改变位域的大小,你不希望它们破坏 - 并且没有公平的作弊,并使位域大小和循环长度成为宏.;-)

c sizeof bit-fields

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

C代码后变量名后的冒号

可能重复:
'unsigned temp:3'表示什么

这是参考页面的C代码示例.

      signed int _exponent:8;
Run Code Online (Sandbox Code Playgroud)

在'8'和'8'之前结肠的含义是什么?

c syntax bit-fields

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

如何在Core Data中使用二进制标志?

int32在Core Data数据库中有一个属性.我用它int作为一个enum位字段.

是否可以NSPredicate根据此int的二进制值创建查询项?有点像@"bitFieldAttribute & 0x0001"

我也想知道这是否可以使用二进制类型属性?

iphone core-data nspredicate nsfetchrequest bit-fields

21
推荐指数
3
解决办法
4314
查看次数

在现代Java 8 API中使用位域而不是EnumSet的理由

EnumSet,就像enum它自身一样古老(自Java 5开始),应该是比特场的用例的非妥协替代品:像位域一样快速和精简(好吧,除了不是原始类型),以及类型安全的启动.另一方面,最新和多年来最受期待的Java API-Streams API - 毫不掩饰地使用了bitfields Spliterator特性.

我是否应该认为上述内容是核心Java专家的明确承认,EnumSet毕竟不是那么好?我是否应该重新考虑从不使用位域的常见最佳实践建议?

java enumset bit-fields java-8

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

是否有可替代C++位域的替代方案

有许多情况(特别是在低级编程中),其中数据的二进制布局很重要.例如:硬件/驱动程序操作,网络协议等.

在C++中,我可以使用char*和按位操作(掩码和移位)读/写任意二进制结构,但这很乏味且容易出错.显然,我试图限制这些操作的范围并将它们封装在更高级别的API中,但它仍然很痛苦.

C++位域似乎为这个问题提供了一个开发人员友好的解决方案,但不幸的是它们的存储是特定于实现的.

NathanOliver提到std::bitset哪些基本上允许你访问一个整数的单个位,operator[]但是很好但缺少多位字段的访问器.

使用元编程和/或宏,可以抽象库中的按位运算.因为我不想重新发明轮子,所以我正在寻找一个(最好是STL或boost)库.

为了记录,我正在研究这个DNS解析器,但问题及其解决方案应该是通用的.

编辑:简短的回答:事实证明,bitfield的存储在实践中是可靠的(即使它不是标准规定的),因为系统/网络库使用它们,并且在使用主流编译器编译时表现良好的程序.

c++ bit-fields

19
推荐指数
3
解决办法
3567
查看次数

是否可以使用位域数组?

我很想知道,是否可以使用位字段数组?喜欢:

struct st
{
  unsigned int i[5]: 4;
}; 
Run Code Online (Sandbox Code Playgroud)

c c++ arrays struct bit-fields

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

是否有理由避免使用位域结构成员?

我早就知道C中有位字段,偶尔我会用它们来定义密集的结构:

typedef struct Message_s {
     unsigned int flag : 1;
     unsigned int channel : 4;
     unsigned int signal : 11;
} Message;
Run Code Online (Sandbox Code Playgroud)

当我阅读开源代码时,我经常会发现位掩码和位移操作,以便在手工滚动的位域中存储和检索这些信息.这是如此常见,我不认为作者不知道位字段语法,所以我想知道是否有理由通过位掩码滚动位字段并转移自己的操作而不是依赖编译器生成用于获取和设置此类位字段的代码.

c struct principles c99 bit-fields

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

Microsoft可以将三值字段存储在一个位中吗?

我完全不了解SQL /数据库,但我和一位朋友聊天,他做了很多关于某些数据库使用"布尔"字段的数据库工作,除了true和false之外,该字段可以取值NULL.

关于这一点,他按照以下方式发表评论:"对于微软来说,他们从未将这种字段称为布尔值,他们只是稍微调用它.如果你有8个或更少的位字段,它就是一个真正的位置.在记录中,它只需要一个字节来存储它们."

当然,这对我来说似乎是不可能的 - 如果该字段可以容纳三个值,那么您将不会将其中的八个放入一个字节中.我的朋友一致认为这看起来很奇怪,但是对无知的低级内部构件表示无知,并且据他所知,从SQL端看这些字段可以容纳三个值,并且确实需要一个字节的存储空间.我想我们中的一个人有一根电线交叉.谁能解释一下这里到底发生了什么?

database sql-server null boolean bit-fields

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

c结构中的压缩位字段 - GCC

我在linux上使用c中的结构.我开始使用位字段和"打包"属性,我遇到了一个奇怪的行为:

struct t1
{
    int a:12;
    int b:32;
    int c:4;
}__attribute__((packed));

struct t2
{
    int a:12;
    int b;
    int c:4;
}__attribute__((packed));

void main()
{
    printf("%d\n",sizeof(t1)); //output - 6
    printf("%d\n",sizeof(t2)); //output - 7
}
Run Code Online (Sandbox Code Playgroud)

为什么两个结构 - 完全相同 - 采用不同的字节数?

c gcc struct packed bit-fields

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