【发布时间】:2017-11-22 19:22:25
【问题描述】:
我有一个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?
【问题讨论】:
-
我们可以从您的方法不起作用的原因开始。一个字符是 8 位宽。当您移动每个字符的位时,您会丢弃从每个单独聊天中移出的位;它不会被推送到数组中的下一个字符。现在对于解决方案,这可能取决于这个问题:您正在使用的字节数是恒定的,还是会发生变化?
-
哦,如果你想确保在 MSB 为 1 时移入 0,我相信你应该使用无符号类型。
-
字节数将会改变。感谢您的回复
-
使用 Weather Vane 的解决方案(并将其标记为已接受)。这是为您的用例执行此操作的最佳方式。
-
据我所知,它最多只能工作 8 位。如果我想移动几百位怎么办?
标签: c memory-mapped-files memory-mapping