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
哪个是完全错误的.我很确定该值存储正确存储到数据中,但我不知道如何读出.
非常感谢 :-)
你从来没有初始化data,你这样做:
data |=
Run Code Online (Sandbox Code Playgroud)
将其初始化为零或将行更改为:
data = insert3<<16 | insert2<<8 | insert1;
Run Code Online (Sandbox Code Playgroud)
你有三个错误:
你传递一个指针uint8_t来scanf,但你使用%d它预期的指针转换int; 你需要用来%hhd告诉scanf你使用的是一个大小为a的存储char,否则你就有可能损坏你的堆栈; 或者您可以将变量更改为int类型或更好(因为标记了问题C++)使用类型安全的std::istream提取运算符(operator >>)
你没有初始化data,并使用了|=,因此将未初始化的值与用户输入的值混合(这会产生垃圾)
使用时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)
| 归档时间: |
|
| 查看次数: |
892 次 |
| 最近记录: |