【发布时间】:2018-07-01 00:55:36
【问题描述】:
我希望从内存中读取 16 位,将它们向任意方向移动 n 次,然后保存回相同的内存位置..
假设在内存位置0xfffaaa 我有:
0101111101100001 我想向右移动一次 (>>1)
所以我声明了一个指向0xfffaaa 的uint16_t 变量。
转换后,该变量包含:
0110000101011111(十进制为 24417)。
右移后:
0011000010101111 1 --> 丢失位。
存储在内存中的是:
1010111100110000 而不是:
0010111110110000 1---> 丢失位。
这里是我尝试做的一个例子..
#include <bitset>
#include <iostream>
using namespace std;
int main(){
volatile uint8_t *bitmap = (uint8_t *)malloc(2);
bitmap[0] = 0b01011111;
bitmap[1] = 0b01100001;
cout << bitset<8>(bitmap[0]);
cout << bitset<8>(bitmap[1]) << '\n' << '\n';
uint16_t* p16 = (uint16_t*)bitmap;
cout << bitset<16>(p16[0]) << '\n';
p16[0]>>=1;
cout << bitset<16>(p16[0]) << '\n' << '\n';
cout << bitset<8>(bitmap[0]);
cout << bitset<8>(bitmap[1]) << '\n';
return 0;
}
控制台输出为:
0101111101100001
0110000101011111
0011000010101111
1010111100110000
如何以我希望使用 uint16_t 的方式进行位移?
【问题讨论】:
-
这在 little-endian 机器上是正常的。是否需要通过保持位图的当前格式来修复它,还是可以调整其字节顺序?
-
我需要保留位图格式。我可以做到这一点,它适用于 uitn16_t 的 uitn8_t,但我需要提高速度,减少操作次数,所以我尝试这种方式(显然我对 uint32_t 和 uint64_t 有同样的问题)。
标签: c++ memory bit-manipulation bit-shift