所以我使用以下代码:
unsigned long replaceByte(unsigned long original,unsigned char newByte,int indexToReplace)
{
int shift = 8 * indexToReplace;
unsigned long value = newByte << shift;
unsigned long mask = 0xff << shift;
return (~mask & original) | value;
}
我有一个给定的单词 |w| 字节。
- 字节从 0(最低有效)到 w/8-1(最高有效)编号。
例如:
replaceByte(unsigned long original, unsigned char newByte, int indexToReplace)
correct answer:
replaceByte(0x12345678CDEF3456, 0xAB, 2) --> 0x1234AB78CDEF3456
(my code's output is: 0x12345678CDAB3456)
correct answer:
replaceByte(0x12345678CDEF3456, 0xAB, 0) --> 0xAB345678CDEF3456
(my code's output is: 0x12345678cdef34AB)
我想我需要检查系统是大端还是小端,因为我的代码更改了完全相反的字节。例如,它改变了 MSB 而不是 LSB。但是......我意识到这并不重要,因为我正在处理比特。
如您所见,此处的代码更改了错误的索引:
(!) Error in index: 0. Output: 0x123456789abcdeff
Answer: 0xff3456789abcdeab
(!) Error in index: 1. Output: 0x123456789abcffab
Answer: 0x12ff56789abcdeab
(!) Error in index: 2. Output: 0x123456789affdeab
Answer: 0x1234ff789abcdeab
(!) Error in index: 3. Output: 0xffffffffffbcdeab
Answer: 0x123456ff9abcdeab
(!) Error in index: 4. Output: 0x123456789abcdeff
Answer: 0x12345678ffbcdeab
(!) Error in index: 5. Output: 0x123456789abcffab
Answer: 0x123456789affdeab
(!) Error in index: 6. Output: 0x123456789affdeab
Answer: 0x123456789abcffab
好吧,我想过将我的代码更改为带有数组的东西,只是为了获得一个数字-> 作为数组在其上运行-> 更改所需的索引-> 就是这样。但是..我不能正确地写它所以我坚持移动的东西(我也不能正确地写)。这是我的尝试:
unsigned long replaceByte(unsigned long original, unsigned char newByte, int indexToReplace){
int size = (sizeof(unsigned long));
char a[size];
for (int i=0; i<size; i++){
if (i=0)
a[0] = original & 0xff;
else
a[i] = original>>(8*i) & 0xff;
}
a[indexToReplace] = newByte;
......// stuck
}
我不允许使用 long long、uint_fast64_t 或 reinterpret_cast 或任何其他“外部”的东西。
我还认为如果代码在 32 位系统或 64 位系统上运行,我需要以某种方式进行更改,以确定哪个大小是无符号长(4 或 8 字节)。