编写一个程序,将位置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.请帮助。
答案 0 :(得分:2)
您的代码不必要地复杂化。考虑同时使用所有三个位进行操作。算法应如下:
… 0011 1000
; … 0111 0000 …
; 实际代码实现留给读者。
答案 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