【问题标题】:how to crack this bit field ?如何破解这个位域?
【发布时间】:2011-02-28 09:13:22
【问题描述】:

我必须编写一个函数setbits(x,p,n,y),它返回x,并在p 位置开始的n 位设置为无符号字符变量y 的最右边n 位(留下其他位不变)。

例如如果x = 10101010 (170 decimal)y = 10100111 (167 decimal)n = 3p = 6 说,那么你需要剥离y (111) 的3 位并将它们放在x 的位置10xxx010 以获得答案10111010

这个函数应该以二进制形式打印出结果。

输出应该是这样的:

x = 10101010 (binary)
y = 10100111 (binary)
setbits n = 3, p = 6 gives x = 10111010 (binary)

您好,我在位字段中遇到了这个问题。
我应该怎么做?

Typedef struct {
    unsigned char x:8;
    unsigned char y:8;
} var;

【问题讨论】:

  • 这不是租用编码器,并且标记它的作业并不意味着我们会为你做。先尝试,然后再提出更具体的问题。

标签: c bit-fields


【解决方案1】:

位域是与此无关的特定 C 发明。例如,你可以有

struct RGB16 {
   unsigned int R : 5;
   unsigned int G : 6;
   unsigned int B : 5;
};

这是一个 16 位的结构,有 3 个组件,每个组件都小于一个字节。但是,C 标准对它们的相对位置只字未提。您不能假设它们在内存中被布置为RRRRRGGGGGGBBBBB。此外,位域宽度是恒定的,在您的情况下,所需的位是可变的。因此,在谷歌上搜索“C 位域”并不能帮助您解决这个问题。

至于您的问题,您应该知道x & binary(11000011) 将中间 4 位清零,y | binary(00111100) 将中间 4 位设置为 1。

【讨论】:

  • 这个问题不是要在比特流中设置 4 位吗?
  • 不准确,不。但是 garima 应该能够将此概括为他的问题(在位置 p 处设置 n 位,而不是在位置 6 处设置 4 位)。
【解决方案2】:

char 不是位字段允许的类型,它们必须是 int 类型。如果您使用 char,您将调用 C 标准未涵盖的实现定义的行为(请参阅 ISO 9899:1999 6.7.2.1 §4)。

因此,如果不知道您使用的是什么系统和编译器,您的问题是不可能回答的。

【讨论】:

  • 嘿 thnx 很多..即使我对此有疑问!!我应该在没有位域的情况下实现这个
  • @garima 最好总是避免位域,C 标准几乎没有涵盖它们。任何涉及位域的代码都将是完全不可移植和不可预测的。最好分配一块字节,然后使用按位运算符访问各个位。如果编译器还不错的话,按位运算符应该会产生完全相同的机器代码。
  • 谢谢伦丁!!这很有帮助
【解决方案3】:

t = y>p; 打印 x&k;

假设每个比特流为 8 比特。

【讨论】:

  • 投反对票。对于家庭作业问题,这是一个糟糕的答案。
猜你喜欢
  • 2021-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多