如何破解这个位域?

时间:2011-02-28 09:13:23

标签: c bit-fields

我必须编写一个函数setbits(x,p,n,y),它返回x,其n位从位置p开始,设置为最右侧n位一个unsigned char变量y(其他位保持不变)。

E.g。如果x = 10101010 (170 decimal)y = 10100111 (167 decimal)以及n = 3p = 6说明你需要剥离3位y (111)并将它们放在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;

3 个答案:

答案 0 :(得分:0)

Bitfields是一个特定的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。

答案 1 :(得分:0)

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

因此,如果不了解您正在使用的系统和编译器,您的问题就无法回答。

答案 2 :(得分:-1)

t = y<(8-n)  k = t>> p;  print x& k;

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