C# 正在编写ByteSwap方法,但未按计划工作

C# 正在编写ByteSwap方法,但未按计划工作,c#,c++,c,C#,C++,C,所以我们需要写一个方法 byteSwap-交换第n个字节和第m个字节 示例:byteSwap(0x12345678,1,3)=0x56341278 byteSwap(0xDEADBEEF,0,2)=0xDEEFBEAD 您可以假设有符号值符号的0算术移位扩展了操作数。如果将临时变量的类型切换为无符号,则解决方案将避免此问题。有符号值符号的算术移位将扩展操作数。如果将临时变量的类型切换为无符号,您的解决方案将避免此问题。这将如何工作 int byteswap(int x,int n,int m)

所以我们需要写一个方法

byteSwap-交换第n个字节和第m个字节

  • 示例:byteSwap(0x12345678,1,3)=0x56341278
  • byteSwap(0xDEADBEEF,0,2)=0xDEEFBEAD

  • 您可以假设有符号值符号的0算术移位扩展了操作数。如果将临时变量的类型切换为无符号,则解决方案将避免此问题。

    有符号值符号的算术移位将扩展操作数。如果将临时变量的类型切换为无符号,您的解决方案将避免此问题。

    这将如何工作

    int byteswap(int x,int n,int m)
    {
        unsigned char *x_bytes = (unsigned char*)&x, tmp = x_bytes[n];
        x_bytes[n] = x_bytes[m];
        x_bytes[m] = tmp;
        return x;
    }
    
    我知道这可能不是你的讲师/某人的想法,但这只是为了展示一个想法。如果有的话,它不使用循环或递归

    这将如何工作

    int byteswap(int x,int n,int m)
    {
        unsigned char *x_bytes = (unsigned char*)&x, tmp = x_bytes[n];
        x_bytes[n] = x_bytes[m];
        x_bytes[m] = tmp;
        return x;
    }
    
    我知道这可能不是你的讲师/某人的想法,但这只是为了展示一个想法。如果有的话,它不使用循环或递归

    这里有一个“更有趣”的解决方案

    unsigned int byteswap(const unsigned int x, unsigned int n, unsigned int m) {
        unsigned int mask;
        m <<= 3;
        n <<= 3;
        mask = ((x >> m) ^ (x >> n)) & 0xFFU;
        mask = (mask << m) | (mask << n);
        return (x ^ mask);
    }
    
    unsigned int byteswap(常量unsigned int x,unsigned int n,unsigned int m){
    无符号整数掩码;
    m(n))&0xFFU;
    mask=(mask这里有一个“更有趣”的解决方案

    unsigned int byteswap(const unsigned int x, unsigned int n, unsigned int m) {
        unsigned int mask;
        m <<= 3;
        n <<= 3;
        mask = ((x >> m) ^ (x >> n)) & 0xFFU;
        mask = (mask << m) | (mask << n);
        return (x ^ mask);
    }
    
    unsigned int byteswap(常量unsigned int x,unsigned int n,unsigned int m){
    无符号整数掩码;
    m(n))&0xFFU;
    
    mask=(mask“we”,所以这肯定是一个家庭作业。:d你写的是哪种语言?这是家庭作业吗?为什么要在“newX”中加1?另外:负数上的按位移位是实现定义的行为。我没有特别看到负数上的移位,但要知道。语言是c。我加1是因为当你(value)时比如说~5会给-6,对吗?“我们”,所以这肯定是一个家庭作业。:d你为哪种语言写作?这是家庭作业吗?你为什么要在“newX”中加1?另外:负数的按位移位是实现定义的行为。我没有特别看到负数的移位,但只是要知道。语言是c。我加1是因为当你使用(~(value)时like~5将赋予-6正确性?该方法是否依赖于CPU的尾数?根据上面的定义,字节0是最低有效字节,此方法在首先存储MSB的CPU上不起作用。该方法是否依赖于CPU的尾数?根据上面的定义,字节0是最低有效字节,此方法将不起作用rk在首先存储MSB的CPU上运行。这很有效,非常感谢。但我不完全理解“扩展”是什么意思这个operand@user1186549解释符号扩展。有一幅很好的图片显示了当数字右移时MSB会发生什么情况。有没有办法使用unsigned?如果我使用unsigned,赋值不会给我分数…当有负数时,我总是以1为关numbers@user1186549您可以添加代码以将最重要的向后移位后,I位无效。仅从设置的MSB开始,将其向右移位nBitShift/mBitShift,用
    ~
    反转,然后使用
    &
    清除被移入的位。或者,您可以按一移位,清除MSB,然后按(mBitShift-1)移位1.这很有效,非常感谢。但我不完全理解你所说的“扩展”是什么意思这个operand@user1186549解释符号扩展。有一幅很好的图片显示了当数字右移时MSB会发生什么情况。有没有办法使用unsigned?如果我使用unsigned,赋值不会给我分数…当有负数时,我总是以1为关numbers@user1186549您可以添加代码以将最重要的向后移位后,I位无效。仅从设置的MSB开始,将其向右移位nBitShift/mBitShift,用
    ~
    反转,然后使用
    &
    清除被移入的位。或者,您可以按一移位,清除MSB,然后按(mBitShift-1)移位。