使用一种按位 : I'll get duplicated values? 的 C++ 函数

标签 c++ bit-manipulation

这是我的 C++ 函数,它使用一种按位:

int genkey(const unsigned char a,const char b,const char c )
{
    int val=0;
    unsigned char *p= reinterpret_cast <unsigned char *>(&val);
    p[0]=a;
    char *q= reinterpret_cast <char *>(&val);
    q[1]=b;
    q[2]=c;
    return val;
}

我用它来生成键(对象的唯一值)。

可以传递给函数的值的范围是:对于a参数=> [0..255],对于b参数=> [0..127]和对于c参数=> [0.. 127].

假设该函数只能使用相同的三个参数值调用一次。例如,只有一次调用的值为 (10, 0, 0)。

函数是否返回重复值?

谢谢。

最佳答案

您的函数可能会为每组唯一的输入值返回唯一的值(假设您的 int 至少为 24 位宽)。然而,更好的写法可能是:

int genkey(const unsigned char a,const char b,const char c )
{
    return a
         | (static_cast<unsigned char>(b) << 8)
         | (static_cast<unsigned char>(c) << 16);
}

这将三个 8 位值组合成一个 24 位值,而无需使用难以读取的指针操作。

请注意,我已注意将 char 值(可能是 signed char,具体取决于您的编译器设置)转换为 unsigned char在移动它们之前。原因是移位会先将值提升为有符号的int,这可能涉及到符号扩展。你不会想要的。

关于使用一种按位 : I'll get duplicated values? 的 C++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4148052/

相关文章:

c++ - 未定义对 `WinMain@16' 的引用

c++ - 为什么 C++11 'auto' 关键字对静态成员不起作用?

c++ - SQL 字符串错误?没有这样的专栏

c++ - 检查是否至少设置了一点而不跳转

c++ - 类设计任务的文字描述?

c++ - 无法在 make 文件中包含库

c - 如果我有真值表,是否有办法确定该真值表所需的按位表达式?

ruby - 清除 Ruby 中的所有其他位

c - 位读取器在连续非 8 倍数读取时失败

matlab - 负整数的位与运算