我在 cs:app datalab 中解决“reverseBytes”时遇到问题。
我必须编写返回相反字节顺序的代码。
示例:输入=0x123456,返回=0x563412
当我使用我的代码时,它无法获得分数..
int reverseBytes(int x) {
int mask=0xff;
int byte1=x>>24;
int byte2=(x>>16)&mask;
int byte3=(x>>8)&mask;
int byte4=x&mask;
int result=(byte4<<24)|(byte3<<16)|(byte2<<8)|(byte1);
return result;
}
但是,当我使用别人的代码时,它需要得分。
int reverseBytes(int x) {
int t2=~(0xff<<24);
int s1=(0xff<<16)+0xff;
int s2=0xff<<8;
int s3=(s2<<16)+s2;
int temp=(x&s1)<<8|((x&s3)>>8&t2);
int q1=(0xff<<8)+0xff;
int q2=q1<<16;
int temp2=(temp&q1)<<16|((temp&q2)>>16&(~q2));
return temp2;
}
我不知道为什么我的代码不能工作.. 我测试了我的代码和其他人的代码。 但我找不到我的代码的结果和另一个代码的结果之间的差异。 请帮助我..
简单的右移即可获取所需的字节:
#include <stdio.h>
#include <stdint.h>
uint32_t reverse_bytes(uint32_t bytes)
{
uint32_t aux = 0;
uint8_t byte;
int i;
for(i = 0; i < 32; i+=8)
{
byte = (bytes >> i) & 0xff;
aux |= byte << (32 - 8 - i);
}
return aux;
}
测试:
int main(void) {
uint32_t input = 0x123456;
printf("input: 0x%08x\n", input);
input = reverse_bytes(input);
printf("input: 0x%08x\n", input);
return 0;
}
打印:
输入:0x00123456
输入:0x56341200
用这个:
#define reverse_bytes_32(num) ( ((num & 0xFF000000) >> 24) | ((num & 0x00FF0000) >> 8) | ((num & 0x0000FF00) << 8) | ((num & 0x000000FF) << 24) )
以下函数可交换您想要的任意长度的字节字符串。
swapbytes()
交换inp
内部inp
参数中包含的所有字节,从而修改inp
的内容。 swapbytesout()
交换 inp
参数内 out
参数的内容,则不会修改 inp
的内容。
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
void * swapbytes(void *inp, size_t len);
void * swapbytesout(void * inp, void *out, size_t len);
/* This function swaps and modifies the content of inp
*
* Returns: a pointer to the output value (inp) */
void * swapbytes(void *inp, size_t len)
{
unsigned int i;
unsigned char *in=(unsigned char *)inp,tmp;
for(i=0;i<len/2;i++) {
tmp=*(in+i);
*(in+i)=*(in+len-i-1);
*(in+len-i-1)=tmp;
}
return inp;
}
/* This function doesn't swap and doesn't modify the content
* of inp, the output is computed on out.
*
* Returns: a pointer to the output value (out) */
void * swapbytesout(void *inp, void *out, size_t len)
{
unsigned int i;
unsigned char *o=(unsigned char *)out;
unsigned char *in=(unsigned char *)inp;
for(i=0;i<len;i++) {
*(o+len-i-1)=*(in+i);
}
return out;
}
int main(void)
{
uint32_t a0,a1;
uint64_t b0,b1;
a0=0x12345678;
printf("%08X\n",*(uint32_t *)swapbytesout(&a0,&a1,sizeof(a0)));
printf("%08X %08X\n",a0,a1);
printf("%08X\n",*(uint32_t *)swapbytes(&a0,sizeof(a0)));
printf("%08X\n",a0);
puts("");
b0=0x123456789ABCDEF0ULL;
printf("%016"PRIX64"\n",*(uint64_t *)swapbytesout(&b0,&b1,sizeof(b0)));
printf("%016"PRIX64" %016"PRIX64"\n",b0,b1);
printf("%016"PRIX64"\n",*(uint64_t *)swapbytes(&b0,sizeof(b0)));
printf("%016"PRIX64"\n",b0);
return 0;
}
移位运算符保留签名。尝试更改“int byte1=x>>24;”到“”int byte1=x>>24&mask;”。 或者只是切换到使用无符号整数。
这是我对不同数量字节的字节顺序进行反转的实现。
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void reverse_byte_order(void *data, uint32_t num_bytes) {
void *dest = malloc(num_bytes);
for (int i = 0; i < num_bytes; ++i) {
memcpy(dest + num_bytes - i - 1, data + i, 1);
}
memcpy(data, dest, num_bytes);
free(dest);
}
int main() {
uint32_t data1 = 0x12345678;
printf("0x%08x\n", data1);
reverse_byte_order(&data1, 4);
printf("0x%08x\n", data1);
uint32_t data2 = 0xabcdef;
printf("0x%04x\n", data2);
reverse_byte_order(&data2, 3);
printf("0x%04x\n", data2);
return 0;
}
输出为:
0x12345678
0x78563412
0xabcdef
0xefcdab
此实现不需要位移位或
AND
/OR
操作。它基本上只是将内存从一个地方复制到另一个地方。但在我看来,它看起来更简单。