所以我试图解决这个问题:
你得到随机的32位正整数,你需要做的是将第3,第4和第5位的位值与24,25和26位的位置交换。
答案 0 :(得分:6)
假设这是一个您不想要显式解决方案的问题,这里有一个提示:使用&
屏蔽相关位,执行移位,然后使用OR
然后使用按位|
。
您可以使用0x00000034
掩码“删除”第3,4和5位,使用0x07000000
掩码“删除”第24,25和26位。
看看这个solution有点反转问题的灵感。
编辑:(回应“不是作业”评论)由于这不是作业,这里有一个更深入的解释:
unsigned int val = ... // your value
unsigned int bits_03_04_05 = val & 0x00000034;
unsigned int bits_24_25_26 = val & 0x07000000;
// Cut out "holes" at bits 3, 4, 5, 24, 25, and 26 of the original value
unsigned int res = val & ~(0x00000034 | 0x07000000);
// Put bits 3, 4, and 5 in place
res |= bits_03_04_05 << 21;
// Put bits 23, 24, and 25 in place
res |= bits_24_25_26 >> 21;
答案 1 :(得分:5)
怎么样:
// snag the values from 3,4,5 (small) and 24,25,26 (large)
int small = value & (7 << 2), large = value & (7 << 23);
// remove the old values, and add in the new ones
value = (value ^ (small | large)) | (large >> 21) | (small << 21);
(将第1位计为LSB;如果你的意思是第0位是LSB,则将数字调整为1)
答案 2 :(得分:0)
要解决此问题,请使用按位operator&
和operator|
的属性,方法是在初始整数值和mask之间应用它们。
假设您有一个初始值:
unsigned int val;// your value
你需要形成一个面具:
int setLSB = 1; // 00000001
int atPosition = 4;
// shift the set bit 4 positions to the left
int mask = setLSB << atPosition; // 00010000
然后用它来检索,清除和设置位值:
// get bit at position 4
unsigned int valueOfFourthBit = val & mask;
// clear bit at position 4 and assign to result
unsigned int res = val & ~(mask);
// put the value of the 4th bit at wanted position
int wantedPosition = 21;
res |= valueOfFourthBit << wantedPosition;
如果你需要一系列连续的比特,如你的情况3,你可以这样做:
int numberOfSetBits = 3;
int setLSBs = 0
for (int i =0; i < numberOfSetBits; ++i)
{
setLSBs += (int) Math.Pow(2, i);
}
setLSBs = 7; // 00000111
// and then the masks for getting 3,4,5 and 24,25,26 bits become
int smallPosition = 3;
int largePosition = 24;
int smallMask = setLSBs << smallPosition; // 0x00000034
int largeMask = setLSBs << largePosition; // 0x07000000;
现有答案涵盖了其余部分。