我正试图找到一种从整数中删除一个位的方法。解决方案不得使用字符串操作。 例如,我的数字为27,二进制为1 1 011。 我想删除第三位,所以它留给我1011。 或者我们有182(10110110),删除第6位,结果是1110110(即118)。我想到算法怎么做,但到目前为止没有运气,我在互联网上找不到有用的信息。
我知道如何使用按位运算符以及如何提取或操作整数位(更改值,交换值等),但我不知道如何“删除”某个位。
我不是在寻找代码,只是操作的逻辑。如果有人能帮助我,那就太棒了!
此致 托尼
答案 0 :(得分:8)
没问题,只需将数字分解为"上部"和#34;下部",把它们放在一起,没有现在消失的中间位。
未经测试:
uint upper = x & 0xFFFFFFF0;
uint lower = x & 7;
return (upper >> 1) | lower;
更一般地说:(也未经过测试)
uint upper = x & (0xFFFFFFFE << n);
uint lower = x & ((1u << n) - 1);
return (upper >> 1) | lower;
答案 1 :(得分:1)
为了做到这一点,你需要两个位掩码和一个班次。
第一位掩码为您提供位n
以上的数字部分,不包括n
位。掩码构造如下:
var top = ~((1U<<(n+1))-1); // 1111 1111 1000 000, 0xFF80
第二位掩码为您提供位n
以下的数字部分,不包括n
位:
var bottom = (1U<<n)-1; // 0000 0000 0011 1111, 0x003F
上面的评论显示了第二个示例的值(即n == 6
)
手中有两个掩码,您可以按如下方式构建结果:
var res = ((original & top)>>1) | (original & bottom);
答案 2 :(得分:0)
您可以使用以下方法:
int value = 27;
string binary = Convert.ToString(value, 2);
binary = binary.Remove(binary.Length-3-1,1); //Remove the exact bit, 3rd in this case
int newValue = Convert.ToInt32(binary, 2);
Console.WriteLine(newValue);
希望它有所帮助!
答案 3 :(得分:0)
int Place = 7;
int TheInt = 182;
string binary = Convert.ToString(TheInt, 2);
MessageBox.Show(binary.Remove(binary.Length - Place, 1));
答案 4 :(得分:0)
这个版本需要的操作比harold的解决方案少一些:
x ^ (((x >> 1) ^ x) & (0xffffffff << n));
我们的想法是,在n
下方,位为零,保持不变,而从n和上方两个x
xored相互抵消,留下x >> 1
。< / p>
答案 5 :(得分:0)
int a = 27;//int= 4byte equal to 32 bit
string binary = "";
for (int i = 0; i < 32; i++)
{
if ((a&1)==0)//if a's least significant bit is 0 ,add 0 to str
{
binary = "0" + binary;
}
else//if a's least significant bit is 1 ,add 1 to str
{
binary = "1" + binary;
}
a = a >> 1;//shift the bits left to right and delete lsb
//we are doing it for 32 times because integer have 32 bit.
}
Console.WriteLine("Integer to Binary= "+binary);
//Now you can operate the string(binary) however you want.
binary = binary.Remove(binary.Length-4,1);//remove 4st bit from str