BitShifting,将3 u_int8_t存储在一个整数中并再次读出

mar*_*s_p 1 c++ bit-manipulation bit-shift

我有一个问题,你们这已经让我疯了2天了.也许是因为我错过了关于位移的基础知识,但不知怎的,我没有把它放到我脑海里.我想要的是一个简单的程序,它读入3个char或uint8_t,将它们存储到一个大的int中,然后再读出来.

这是我第一次尝试比特移位,不知怎的,我被卡住了.

这是代码:

int main (int argc, const char * argv[])
{
    u_int8_t insert1;
    u_int8_t insert2;
    u_int8_t insert3;
    int data;

    printf("Please enter value1: ");
    scanf("%d", &insert1);
    printf("Please enter value2: ");
    scanf("%d", &insert2);
    printf("Please enter value3: ");
    scanf("%d", &insert3);

    data |= insert3<<16 | insert2<<8 | insert1;

    printf("\nValue1: %d\n", data);
    printf("Value2: %d\n", data>>8);
    printf("Value3: %d\n", data>>16);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我进入

126 103 255

我得到:

值1:16711680值2:65280值3:255

哪个是完全错误的.我很确定该值存储正确存储到数据中,但我不知道如何读出.

非常感谢 :-)

Mys*_*ial 6

你从来没有初始化data,你这样做:

data |= 
Run Code Online (Sandbox Code Playgroud)

将其初始化为零或将行更改为:

data = insert3<<16 | insert2<<8 | insert1;
Run Code Online (Sandbox Code Playgroud)


Syl*_*sne 6

你有三个错误:

  1. 你传递一个指针uint8_tscanf,但你使用%d它预期的指针转换int; 你需要用来%hhd告诉scanf你使用的是一个大小为a的存储char,否则你就有可能损坏你的堆栈; 或者您可以将变量更改为int类型或更好(因为标记了问题C++)使用类型安全的std::istream提取运算符(operator >>)

  2. 你没有初始化data,并使用了|=,因此将未初始化的值与用户输入的值混合(这会产生垃圾)

  3. 使用时printf,如果只想查看低位,则需要屏蔽高位

所以,你的代码需要阅读:

#include <iostream>

static void readvalue(const char* name, uint8_t& outValue) {
    std::cout << "Please enter " << name << ": " << std::flush;
    std::cin >> outValue;
    std::cout << "\n";
}

int main() {
    uint8_t value1, value2, value3;
    readvalue("value1", value1);
    readvalue("value2", value2);
    readvalue("value3", value3);

    data = insert3<<16 | insert2<<8 | insert1;

    std::cout << "Value1: " << (data & 0xff);
    std::cout << "Value2: " << ((data >> 8) & 0xff);
    std::cout << "Value3: " << ((data >> 16) & 0xff);
}
Run Code Online (Sandbox Code Playgroud)