我可以用printf作为十六进制或八进制数打印.是否有格式标记打印为二进制或任意基数?
我正在运行gcc.
printf("%d %x %o\n", 10, 10, 10); //prints "10 A 12\n"
print("%b\n", 10); // prints "%b\n"
Run Code Online (Sandbox Code Playgroud) 我想知道为什么bitfields与unions/structs一起工作,但是没有像int或那样的普通变量short.
这有效:
struct foo {
int bar : 10;
};
Run Code Online (Sandbox Code Playgroud)
但这失败了:
int bar : 10; // "Expected ';' at end of declaration"
Run Code Online (Sandbox Code Playgroud)
为什么此功能仅在联合/结构中可用而不在变量中?技术不一样吗?
编辑:
如果允许,你可以创建一个3字节的变量,而不是每次都使用struct/union成员.这就是我对结构的看法:
struct int24_t {
int x : 24 __attribute__((packed));
};
struct int24_t var; // sizeof(var) is now 3
// access the value would be easier:
var.x = 123;
Run Code Online (Sandbox Code Playgroud) 在这个问题中,假设所有整数都是无符号的.
假设我想编写2个函数,打包和解包,这样可以将较小宽度的整数打包成64位整数.但是,整数的位置和宽度是在运行时给出的,所以我不能使用C位域.
最快的是用一个例子来解释.为简单起见,我将用8位整数来说明:
* *
bit # 8 7 6 5 4 3 2 1
myint 0 1 1 0 0 0 1 1
Run Code Online (Sandbox Code Playgroud)
假设我想在位置5处"解包",这是一个宽度为2的整数.这些是用星号标记的两位.该操作的结果应为0b01.同样,如果我在宽度为6的位置2解包,我会得到0b100011.
我可以使用bithift-left和bithift right轻松编写解包函数.
但我想不出一个明确的方法来编写一个等效的"包"函数,这将做相反的事情.
假设给定一个整数0b11,将其打包到位置5的myint(从上面),宽度2将产生
* *
bit # 8 7 6 5 4 3 2 1
myint 0 1 1 1 0 0 1 1
Run Code Online (Sandbox Code Playgroud)
我想出的最好的东西涉及很多用OR,<<和>>来整合的位串.在我实施和测试之前,也许有人看到了一个聪明的快速解决方案?