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!!这很有帮助