我有一个名为replaceByte(x,n,c)
的函数,用n
替换x
中的字节c
,但有以下限制:
replaceByte(0x12345678,1,0xab) = 0x1234ab78
! ~ & ^ | + << >>
Max ops:10
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;
}
答案 0 :(得分:7)
由于这看起来像家庭作业,我不打算发布代码,但列出了你需要执行的步骤:
c
转换为32位数字,以便在移位时不会丢失任何位c
向右移动适当的位数(如果n==0
没有移位,如果n==1
移动8等等。)x
的最低8位置零,然后将此掩码移动与上一步相同的量x
将x
c
值和x
的按位OR(或加法)以替换后者的屏蔽位答案 1 :(得分:4)
啊......你快到了。
只需更改
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;
}
答案 2 :(得分:2)
正确的解决方案也适用于c = 0:
int replaceByte(int x, int n, int c)
{
int shift = 8 * n;
int value = c << shift;
int mask = 0xff << shift;
return (~mask & x) | value;
}