C++使用一种按位的函数:我会得到重复的值吗?

发布于 2024-10-01 19:07:52 字数 518 浏览 3 评论 0原文

这是我的 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;
}

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

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

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

函数是否返回重复值?

谢谢。

this is my C++ function that uses a kind of bitwise:

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;
}

I'm using that for generating keys (unique value for object).

The range of the values that can be passed to the function are: for a parameter => [0..255], for b parameter => [0..127] and for c parameter => [0..127].

Assume that the function can be called only once with the same three arguments values. For example there will be only one call with values (10, 0, 0).

Does function return duplicated values?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

囚我心虐我身 2024-10-08 19:07:52

您的函数可能会为每个唯一的输入值集返回唯一的值(假设您的 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,这可能涉及符号扩展。你不会想要那样的。

Your function probably returns unique values for each unique set of input values (assuming your int is at least 24 bits wide). However, a better way to write this might be:

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);
}

This combines three 8-bit values into a single 24-bit value without using hard-to-read pointer manipulation.

Note that I have taken care to cast the char values (which might be signed char depending on your compiler settings) to unsigned char before shifting them. The reason is that shifting will first promote the value to a signed int, which may involve sign extension. You won't want that.

桃扇骨 2024-10-08 19:07:52

您的代码将在不同的架构上给出不同的结果。当然,也许这并不重要。

这是一个便携式等效项:

return ((((int) a << 8) + b) << 8) + c;

或者这样:

return ((((int) a * 256) + b) * 256) + c;

Your code will give different results on different architectures. Maybe that doesn't matter, of course.

This is a portable equivalent:

return ((((int) a << 8) + b) << 8) + c;

Or this:

return ((((int) a * 256) + b) * 256) + c;
じее 2024-10-08 19:07:52

在任何我能想到的合理机器上,唯一的输入值将产生唯一的结果。

On any reasonable machine that I can think of unique input values will produce a unique result.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文