如何正确移位一大块数据?

时间:2017-11-22 19:22:26

标签: c memory-mapped-files memory-mapping

我有一个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?

1 个答案:

答案 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)。