C 如何破解这个比特域?

C 如何破解这个比特域?,c,bit-fields,C,Bit Fields,我必须编写一个函数setbit(x,p,n,y),它返回x,其中n位从p位置开始,设置为无符号字符变量y的最右边n位(其他位保持不变) 例如,如果x=10101010(170位小数)和y=10100111(167位小数)和n=3和p=6说,那么你需要去掉y(111)的3位,并将它们放在x的10xxx010位置,以得到答案10111010 此函数应以二进制形式打印结果 输出应如下所示: x = 10101010 (binary) y = 10100111 (binary) setbits n =

我必须编写一个函数
setbit(x,p,n,y)
,它返回
x
,其中
n
位从
p
位置开始,设置为无符号字符变量
y
的最右边
n
位(其他位保持不变)

例如,如果
x=10101010(170位小数)
y=10100111(167位小数)
n=3
p=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语言的一项特殊发明,与此无关。例如,你可以

struct RGB16 {
   unsigned int R : 5;
   unsigned int G : 6;
   unsigned int B : 5;
};
这是一个16位的结构,有3个分量,每个分量都小于一个字节。然而,C标准没有说明它们的相对位置。您不能假设它们在内存中的布局是
rrrrrrrgggggbbbbb
。此外,BitFieldWidth是恒定的,在您的情况下,所需的位是可变的。所以,在谷歌上搜索“C位域”不会帮你解决这个问题

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

t=yp; 打印x&k


假设每个位流为8位。

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


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

这不是“租一个编码器”,并且将其标记为家庭作业并不意味着我们将为您做这件事。试着先回答一个更具体的问题,然后投票否决。对于家庭作业问题来说,这是一个糟糕的答案。这个问题不是关于在比特流中设置4位,对吗?不准确,不。但是garima应该能够将这一点推广到他的问题上(将
n
位设置在
p
,而不是位置6的4位)。嘿,thnx很多。即使我对此也有疑问!!我应该在不使用位字段的情况下实现它吗then@garima最好避免使用位字段,因为它们几乎不被C标准所覆盖。任何涉及位域的代码都是完全不可移植和不可预测的。最好先分配一块字节,然后使用逐位运算符访问各个位。如果编译器有点像样,位运算符应该产生完全相同的机器代码。thnk Lundin!!这很有帮助