在整数中将一位与另一位交换,代码不起作用

时间:2014-02-21 09:11:03

标签: c# bit-manipulation bitwise-operators

  

编写一个程序,将位置3,4和5上的位值与给定位置24,25和26上的位进行交换   32位无符号整数。

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

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.请帮助。

3 个答案:

答案 0 :(得分:2)

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

  1. 通过使用… 0011 1000;
  2. 进行屏蔽来分隔位3,4,5
  3. 向左移动21到24,25,26;
  4. 通过使用… 0111 0000 …;
  5. 进行屏蔽来分隔位24,25,26
  6. 向右移动21到位置3,4,5;
  7. 原始变量中的掩蔽输出3,4,5,24,25,26通过ANDing与'... 1000 1111 ... 1100 01111';
  8. 通过将它们与(5)的结果进行或运算,混合(2)和(4)的临时结果。
  9. 实际代码实现留给读者。

答案 1 :(得分:1)

假设:

int b24 = (num >> 24) & 1;

表示b24只能包含0或1.这意味着:

num & (~(1 << b24))

将清除num的第0位或第1位。然后:

| (b3 << 24);

要么设置位24(如果b3为1),要么将其保留为当前具有的任何值(如果b3为0)。你可能想要:

num & (~(1 << 24))

清除数字的第24位。

(对所有剩余行应用相同的逻辑。每个行重复清除num的第0位或第1位,然后尝试设置不同位的值)

答案 2 :(得分:1)

例如输入x

x = 1234567890              // == 0100 1001 1001 0110 0000 0010 1101 0010

获取上下面具

umask = 7 << 24             // == 0000 0111 0000 0000 0000 0000 0000 0000
lmask = 7 << 3              // == 0000 0000 0000 0000 0000 0000 0011 1000

获取我们想要交换的位

y = x & umask               // == 0000 0001 0000 0000 0000 0000 0000 0000
z = x & lmask               // == 0000 0000 0000 0000 0000 0000 0001 0000

将y移至较低位置

y = y >> (24 - 3)           // == 0000 0000 0000 0000 0000 0000 0000 1000

将z移至较高位置

z = z << (24 - 3)           // == 0000 0010 0000 0000 0000 0000 0000 0000

屏蔽旧值

x = x & ~( umask | lmask )  // == 0100 1000 1001 0110 0000 0010 1100 0010

加入新值

x = x | y | z               // == 0100 1010 1001 0110 0000 0010 1100 1010