相关疑难解决方法(0)

如何计算32位整数中的设置位数?

代表数字7的8位看起来像这样:

00000111
Run Code Online (Sandbox Code Playgroud)

设置三位.

什么算法来确定32位整数中的设置位数?

algorithm binary bit-manipulation hammingweight iec10967

838
推荐指数
31
解决办法
52万
查看次数

陷阱表示

  1. 什么是C中的陷阱表示(某些示例可能有帮助)?这适用于C++吗?

    float f=3.5;
    int *pi = (int*)&f;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 编辑:我知道'pi'违反了别名规则,根据C标准它是UB.至少在海湾合作委员会它没有产生任何错误,但警告.在这个实现(即GCC)中,假设sizeof(int) == sizeof(float)do f*pi具有相同的二进制表示/模式?MSVC怎么样?

c c++ gcc visual-studio-2010

63
推荐指数
3
解决办法
1万
查看次数

char保证恰好是8位长吗?

就这样.没有找到任何类似的话题所以请耐心等待.

c types char

59
推荐指数
5
解决办法
7万
查看次数

跨C和C ++标准的可靠类型处理

有没有一种方法可以在C和C ++中都有效?最好是较低的开销,并避免琐碎的预处理程序入侵。

在C89中,我知道我可以做这样的事情:

unsigned int float_bits(float num) {
    return *(unsigned int *)#
}
Run Code Online (Sandbox Code Playgroud)

但是,这违反了C99的严格别名规则。因此,这样的事情在各种C标准中可能更易于移植:

unsigned int float_bits(float num) {
    union { float f; unsigned int i; } u;
    u.f = num;
    return u.i;
}
Run Code Online (Sandbox Code Playgroud)

但是我知道这不是有效的C ++,因为一次联盟中只有一个成员可以处于“活动”状态。为C和C ++提供的典型解决方案是这样的:

unsigned int float_bits(float num) {
    unsigned int i;
    memcpy(&i, &num, sizeof(int));
    return i;
}
Run Code Online (Sandbox Code Playgroud)

但是,这依赖于编译器能够优化对memcpy的调用。memcpy是唯一可跨C和C ++标准移植的方法吗?

c c++ type-conversion language-lawyer type-punning

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