c# - 将整数中的一位与另一位交换,代码不起作用

标签 c# bit-manipulation bitwise-operators

Write a program that exchanges the values of the bits on positions 3, 4 and 5 with bits on positions 24, 25 and 26 of a given 32-bit unsigned integer.

所以上面是练习,下面是我的工作。

int number = 28;                                //number                         -0001 1100    28
int bit3 = (number >> 3) & 1;                   //obtain bit 3rd bit from left   -0000 0001     1
int bit3return = bit3 << 3;                     //return bit to possition        -0000 1000     8
int numberReturn = number & (~(bit3return));    //number with bit place reversed -0001 0100    20

int number2 = 20;                               //number                         -0001 0100    20
int bit3Return = 1 << 3;                        //return bit to possition        -0000 1000     8
int numberReturn2 = number2 + bit3Return;       //number with bit place reversed -0001 0100    28

这是我的最终代码。

Console.WriteLine("Enter a number to be modified:");
int num = int.Parse(Console.ReadLine());

int b3 = (num >> 3) & 1;
int b4 = (num >> 4) & 1;
int b5 = (num >> 5) & 1;
int b24 = (num >> 24) & 1;
int b25 = (num >> 25) & 1;
int b26 = (num >> 26) & 1;

num = num & (~(1 << b24)) | (b3 << 24);
num = num & (~(1 << b3)) | (b24 << 3);
num = num & (~(1 << b25)) | (b4 << 25);
num = num & (~(1 << b4)) | (b25 << 4);
num = num & (~(1 << b26)) | (b5 << 26);
num = num & (~(1 << b5)) | (b26 << 5);

Console.WriteLine(num);

问题是,它不起作用:

我输入 56 即:

  • 0000 0000 0000 0000 0000 0000 0011 1000

输出应为 117440512,即:

  • 0000 0111 0000 0000 0000 0000 0000 0000

但是我得到 117440568 是:

  • 0000 0111 0000 0000 0000 0000 0011 1000

如果我输入 117440512 我会得到相同的输出,所以 0 变成 1 但 1 不会变成 0。请帮忙。

最佳答案

您的代码不必要地复杂。考虑同时操作所有三个位。算法应该如下:

  1. 通过使用…0011 1000进行屏蔽来分隔第3、4、5位;
  2. 左移 21 到位置 24、25、26;
  3. 通过使用 … 0111 0000 … 屏蔽来分隔第 24、25、26 位;
  4. 右移 21 到位置 3、4、5;
  5. 通过与“…1000 1111 … 1100 01111”进行与运算,屏蔽掉原始变量中的 3、4、5、24、25、26;
  6. 将 (2) 和 (4) 的临时结果与 (5) 的结果进行 OR 运算。

实际的代码实现留给读者。

关于c# - 将整数中的一位与另一位交换,代码不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21929911/

相关文章:

c# - CultureInfo 的包装器

c# - 为什么我无法调整表格以适应显示器的尺寸? (Windows 窗体)

c - a >> ((sizeof a) * CHAR_BIT) 是定义的,UB 还是 IDB?

c - "*="在C编程中到底是什么意思?

c - #define x 2|0 在 C 中

c# - 如何解锁被 .NET 中的进程锁定的文件

c# - Linq-to-Entities/Linq-to-SQL,哪种数据轮询方式更高效?

c - 使用镜像算法进行快速位反转

bash - Bash 中的位掩码

C - 打印给定字符的二进制文件