相关疑难解决方法(0)

是否有printf转换器以二进制格式打印?

我可以用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)

c printf

404
推荐指数
22
解决办法
73万
查看次数

为什么普通变量不允许使用位域?

我想知道为什么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)

c gcc struct unions bit-fields

4
推荐指数
1
解决办法
891
查看次数

C中的"动态位域"

在这个问题中,假设所有整数都是无符号的.

假设我想编写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,<<和>>来整合的位串.在我实施和测试之前,也许有人看到了一个聪明的快速解决方案?

c bit-manipulation

1
推荐指数
1
解决办法
1109
查看次数

标签 统计

c ×3

bit-fields ×1

bit-manipulation ×1

gcc ×1

printf ×1

struct ×1

unions ×1