我必须编写一个函数setbits(x,p,n,y)
,它返回x
,其n
位从位置p
开始,设置为最右侧n
位一个unsigned char变量y
(其他位保持不变)。
E.g。如果x = 10101010 (170 decimal)
和y = 10100111 (167 decimal)
以及n = 3
和p = 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;
答案 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比特。