在32位数字代替字节

我有一个调用的函数replaceByte(x,n,c)是代替字节nxc有以下限制:

  • 字节从编号为0(LSB)至3(MSB)
  • 例如: replaceByte(0x12345678,1,0xab) = 0x1234ab78
  • 可以假设0 <= N <= 3和0 <= C <= 255
  • 法律OPS: ! ~ & ^ | + << >> ! ~ & ^ | + << >>
  • 最大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; }

--------------解决方案-------------

啊...你几乎没有。

只要改变

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;
}

因为这看起来像功课我不打算发布的代码,但列出你需要执行的步骤:

  1. c成一个32位的号码,以便转移的同时不丢失任何位
  2. 接着,移c由比特向左适当数量(如果n==0没有移位,如果n==1移位8等)
  3. 创建一个32位掩码,将零的最低8位x ,然后按相同的量作为最后一步移位该掩模
  4. 执行按位与移位位掩码和x零出的相应位x
  5. 执行移位的位或(或加成) c值和x代替后者的掩码位
分类:C# 时间:2015-03-14 人气:0
本文关键词:
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.911 (s). 10 q(s)