我有一个mmap
void *mymap;
mymap = mmap(0, attr.st_size, PROT_READ|PROT_WRITE, MAPFILE|MAP_SHARED, fd, 0);
我打开了一个HEX内容为0x25362364的文件,这是
00100101001101100010001101100100
二进制。现在我想进行一点转变:
char *str = (char *)mymap;
for(int i=0;i<attr.st_size;i++) {
str[i] = str[i] >> 4;
}
我的新文件包含新的二进制数
00000010000000110000001000000110
但希望的结果是将所有4位向右移动:
00000010010100110110001000110110
我该怎么做到这一点? 红利问题:如果二进制数字MSB是1,那么当向右移动时我怎么能让左侧充满0?
答案 0 :(得分:4)
数组中的每个字节应向右移位4位,并将前一个(无符号)字节向左移位4位进行ORred。例如
unsigned char *str = (unsigned char *)mymap;
unsigned char prev = 0, next;
for(int i = 0; i < attr.st_size; i++) {
next = str[i];
str[i] = (str[i] >> 4) | (prev << 4);
prev = next;
}
如果你想要一个5位的右移,你将向右移5位,向左移3位,sum = 8(假设CHAR_BIT
为8)。