Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将4个字符放入一个整数中? 我在C++中开发了一个复制GM缓冲系统来熟悉比特,这样就不错了,但是我遇到了一个问题。如何将4个不同的字符推入一个int?我不擅长按位排序,我从未使用过它。我不知道该怎么做_C++_Bit Shift - Fatal编程技术网

如何将4个字符放入一个整数中? 我在C++中开发了一个复制GM缓冲系统来熟悉比特,这样就不错了,但是我遇到了一个问题。如何将4个不同的字符推入一个int?我不擅长按位排序,我从未使用过它。我不知道该怎么做

如何将4个字符放入一个整数中? 我在C++中开发了一个复制GM缓冲系统来熟悉比特,这样就不错了,但是我遇到了一个问题。如何将4个不同的字符推入一个int?我不擅长按位排序,我从未使用过它。我不知道该怎么做,c++,bit-shift,C++,Bit Shift,在这件事上,我有一系列的角色;大小byteArraySize并且当我调用grab int函数时,它将从bufferPointer+4到bufferPointer;向后以正确获取int 我读到一个关于位移位(lol)的位,我想我可以将每个字符的位I向右移位。我只是不知道从哪里开始 非常感谢您的帮助。是的,您可以将4个chars(实际上sizeof(int)chars)打包成int。以下是您如何做到这一点: unsigned int packChars(unsigned char *c) { u

在这件事上,我有一系列的角色;大小
byteArraySize
并且当我调用grab int函数时,它将从
bufferPointer+4
bufferPointer
;向后以正确获取int

我读到一个关于位移位(lol)的,我想我可以将每个字符的位
I
向右移位。我只是不知道从哪里开始


非常感谢您的帮助。

是的,您可以将4个
char
s(实际上
sizeof(int)
char
s)打包成
int
。以下是您如何做到这一点:

unsigned int packChars(unsigned char *c)
{
  unsigned int val = u0;
  for (size_t idx = 0; idx < sizeof(unsigned int); ++idx) {
    val |= c[idx] << (idx * CHAR_BIT);
  }
}
unsigned int packChars(unsigned char*c)
{
无符号int val=u0;
对于(size_t idx=0;idxval |=c[idx]一种可能的解决方案是使用一个并集,使其所有成员从内存中的同一偏移量对齐

例如:

union Color
{
    std::uint32_t m_rgba;

    struct
    {
        std::uint8_t m_a;
        std::uint8_t m_b;
        std::uint8_t m_g;
        std::uint8_t m_r;
    };
};

Color white = { 0xffffffff };

首先,您应该知道,sizeof(int)不必是4*sizeof(char)。标准仅保证sizeof(int)>=sizeof(char),仅此而已


事实上,int的大小可以与char的大小相同(或更大),但你永远不会知道,除非你发现了这一点。

学究般地说,在纯标准的C++14或C++11中,你可能不知道

顺便说一句,没有什么可以禁止一个假设的C++14实现将所有的
char
short
unsigned short
int
unsigned int
unsigned long
unsigned long
unsigned long
都是相同的类型(至少是相同的内部表示),并且全部是64位,(或96位或128位)和所有的<代码> sieOS< <代码> >。最近的C和C++标准规定长Lo/<代码>至少有64位。

IIRC,一些常见Lisp之上的奇怪的C实现也在做类似的事情

但当然,在实践中没有这样的C++14实现

实际上,在大多数实现中,
char
-s是8位字节(可能是
有符号的
可能是
无符号的
),而
int
-s通常是32位字(例如是
std::int32_t
),显然可以进行编码

 inline int pack4chars(char c1, char c2, char c3, char c4) {
    return ((int)(((unsigned char)c1) << 24)
            |  (int)(((unsigned char)c2) << 16)
            |  (int)(((unsigned char)c3) << 8)
            |  (int)((unsigned char)c4));
}
inline int pack4chars(字符c1、字符c2、字符c3、字符c4){

返回((int)((无符号字符)c1)
byte0|(byte1我在这里没有看到任何研究成果的证据。这是非常基本和简单的。你尝试过任何东西吗?读过一本书吗?学习编程入门课程吗?我不认为这完全是你的意思……也许是嵌套结构?你是绝对正确的。它通常可以工作,但不幸的是,它显然是未定义的行为。)根据标准:在一个联合体中,最多一个非静态数据成员可以在任何时候处于活动状态,也就是说,最多一个非静态数据成员的值可以在任何时候存储在一个联合体中。这并不意味着它是“显式未定义的行为”。在引用的语句之后,该标准还提到:“联合的大小足以包含其最大的非静态数据成员。分配每个非静态数据成员时,将其视为结构的唯一成员。联合对象的所有非静态数据成员都具有相同的地址"。当访问联合体的成员时,实际上您正在访问与同一联合体的任何其他成员相同的内存区域。@KnightsWatch:您是对的,它不是显式的,但正如它在具有结构类型T1的活动成员的标准布局联合体中明确指出的那样,它被允许读取的另一个联合体成员的非静态数据成员m结构类型T2假设m是T1和T2的公共初始序列的一部分,我假设不允许读取不尊重该序列的数据成员。谢谢,您的代码是我见过的最容易理解的代码!