C# 如何删除整数中的第 n 位?
C# How to remove the n-th bit in integer?
我正在尝试找到一种从整数中删除一位的方法。该解决方案不得使用字符串操作。
例如,我有数字 27,二进制为 11011。
我想删除第三位,这样我就剩下 1011。
或者我们有 182 (10110110),删除第 6 位,结果是 1110110(即 118)。我正在尝试考虑算法如何做到这一点,但到目前为止运气不佳,而且我无法在互联网上找到有用的信息。
我知道如何使用按位运算符以及如何提取或操作整数中的位(更改值、交换值等),但我不知道如何 'remove' 某个位。
我不是在寻找代码,只是在寻找操作逻辑。如果有人能帮助我,那就太棒了!
此致,
托尼
没问题,把数字分解成"upper part"和"lower part",然后把它们放在一起,去掉现在消失的中间位
未测试:
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;
为此,您需要两个位掩码和一个移位。
第一个位掩码为您提供第 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
)
有了这两个mask,就可以构造出如下结果:
var res = ((original & top)>>1) | (original & bottom);
您可以使用以下方法:
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);
希望对您有所帮助!
int Place = 7;
int TheInt = 182;
string binary = Convert.ToString(TheInt, 2);
MessageBox.Show(binary.Remove(binary.Length - Place, 1));
这里是一个比 harold 的解决方案需要更少操作的版本:
x ^ (((x >> 1) ^ x) & (0xffffffff << n));
想法是,在 n
以下,位与零进行异或,保持不变,而在 n 及以上,两个 x
异或相互抵消,留下 x >> 1
.
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
我正在尝试找到一种从整数中删除一位的方法。该解决方案不得使用字符串操作。 例如,我有数字 27,二进制为 11011。 我想删除第三位,这样我就剩下 1011。 或者我们有 182 (10110110),删除第 6 位,结果是 1110110(即 118)。我正在尝试考虑算法如何做到这一点,但到目前为止运气不佳,而且我无法在互联网上找到有用的信息。
我知道如何使用按位运算符以及如何提取或操作整数中的位(更改值、交换值等),但我不知道如何 'remove' 某个位。
我不是在寻找代码,只是在寻找操作逻辑。如果有人能帮助我,那就太棒了!
此致, 托尼
没问题,把数字分解成"upper part"和"lower part",然后把它们放在一起,去掉现在消失的中间位
未测试:
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;
为此,您需要两个位掩码和一个移位。
第一个位掩码为您提供第 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
)
有了这两个mask,就可以构造出如下结果:
var res = ((original & top)>>1) | (original & bottom);
您可以使用以下方法:
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);
希望对您有所帮助!
int Place = 7;
int TheInt = 182;
string binary = Convert.ToString(TheInt, 2);
MessageBox.Show(binary.Remove(binary.Length - Place, 1));
这里是一个比 harold 的解决方案需要更少操作的版本:
x ^ (((x >> 1) ^ x) & (0xffffffff << n));
想法是,在 n
以下,位与零进行异或,保持不变,而在 n 及以上,两个 x
异或相互抵消,留下 x >> 1
.
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