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。请帮忙。
最佳答案
您的代码不必要地复杂。考虑同时操作所有三个位。算法应该如下:
- 通过使用
…0011 1000
进行屏蔽来分隔第3、4、5位; - 左移 21 到位置 24、25、26;
- 通过使用
… 0111 0000 …
屏蔽来分隔第 24、25、26 位; - 右移 21 到位置 3、4、5;
- 通过与“…1000 1111 … 1100 01111”进行与运算,屏蔽掉原始变量中的 3、4、5、24、25、26;
- 将 (2) 和 (4) 的临时结果与 (5) 的结果进行 OR 运算。
实际的代码实现留给读者。
关于c# - 将整数中的一位与另一位交换,代码不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21929911/