我有一个称为replaceByte(x,n,c)
的函数,该函数将n
中的字节x
替换为c
,但有以下限制:
replaceByte(0x12345678,1,0xab) = 0x1234ab78
! ~ & ^ | + << >>
int replaceByte(int x, int n, int c) {
int shift = (c << (8 * n));
int mask = 0xff << shift;
return (mask & x) | shift;
}
但是当我测试它时,我得到这个错误:
错误:测试replaceByte(-2147483648 [0x80000000],0 [0x0],0 [0x0])失败...
...给出0 [0x0]。应为-2147483648 [0x80000000]
意识到*不是合法运算符后,我终于弄清楚了...如果您好奇的话,这就是我所做的:
int replaceByte(int x, int n, int c) {
int mask = 0xff << (n << 3);
int shift = (c << (n << 3));
return (~mask & x) | shift;
}
最佳答案
啊...你快到了。
只是改变
return (mask & x) | shift;
至
return (~mask & x) | shift;
mask
应该包含所有字符,除了要屏蔽的区域,反之亦然。我正在使用这个简单的代码,它在gcc中可以正常工作
#include<stdio.h>
int replaceByte(int x, int n, int c)
{
int shift = (c << (8 * n));
int mask = 0xff << shift;
return (~mask & x) | shift;
}
int main ()
{
printf("%X",replaceByte(0x80000000,0,0));
return 0;
}