改变整数位

时间:2013-11-17 12:45:28

标签: c# integer bit

好的,我有N =整数,P =位置,V = 0或1 我必须将整数N的位置P的位改为值V.
我正在尝试用 N = 5(101)
P = 2(取1)
V = 0(必须使其为零)
结果是97(1100 0001)(应该是0000 0001) 我认为问题来自掩码,因为当我在控制台中写入它的-5(应该是)但是如果我解析它,看到它的位我得到一个错误(溢出)
该程序正在制定中,所以我目前正在研究 V = 0 ,所以不要尝试1
昨天我发了一个问题,很多人发帖说“这不是问题 - 你要我们解决你的问题”
- 不,我不想让你解决我想知道的问题为什么在int result = mask& integerBinary;我得到97而不是1

using System;
class ChangeBit
{
    static void Main()
    {
        Console.Write("(n) Type an integer: ");
        string integerLine = Console.ReadLine(); // Read string from console
        Console.Write("(p) Type position: ");
        string positionLine = Console.ReadLine(); // Read string from console
        Console.Write("(v) Type 0 or 1: ");
        string valueLine = Console.ReadLine(); // Read string from console
        int value;
        int integer;
        int position;
        if (int.TryParse(integerLine, out integer) && int.TryParse(positionLine, out position) && int.TryParse(valueLine, out value)) // Try to parse the strings as integers
        {
            int integerBinary = int.Parse(Convert.ToString(integer, 2));
            int bitValue = ((1 << position) & integerBinary) >> position;
            int mask = ~(1 << position);
            if (value==0)
            {
            int result = mask & integerBinary;
            Console.WriteLine("(n) After bit conversion = {0}", result);
            }
            else Console.WriteLine("(n) After bit conversion = {0}", integer);
        }
        else
        {
        Console.WriteLine("Invalid input.");
       }
    }
}

4 个答案:

答案 0 :(得分:1)

更容易:

        if (int.TryParse(integerLine, out integer) && int.TryParse(positionLine, out position) && int.TryParse(valueLine, out value)) // Try to parse the strings as integers
        {
            BitArray a = new BitArray(BitConverter.GetBytes(integer));
            a.Set(position, value == 1);

            Console.WriteLine("(n) After bit conversion = {0}", a.GetInt32());
        }

声明GetInt32:

internal static class BitArrayEx
{
    internal static int GetInt32(this BitArray bitArray)
    {
        int[] array = new int[1];
        bitArray.CopyTo(array, 0);
        return array[0];
    }
}

答案 1 :(得分:1)

尝试:

integer ^ ((-value ^ integer) & (1 << position))

这将检查该位是否已设置,如果是,将使用按位运算符 ^ 更改其值。

答案 2 :(得分:0)

您正在将二进制字符串表示与二进制整数混合使用:

int integerBinary = int.Parse(Convert.ToString(integer, 2));

此行integerBinary之后的

是因为您已将其从101的二进制字符串表示形式"101"转换而来。之后所有整数操作都是无效的,因为101没有意义。

答案 3 :(得分:0)

此代码有两个问题 第一

int integerBinary = int.Parse(Convert.ToString(integer, 2));

不需要,导致输入整数可以直接用来做逻辑运算, 并且这一行并不意味着将整数转换为二进制格式,此行整数变为不同的数字

第二

else Console.WriteLine("(n) After bit conversion = {0}", integer);

如果值为1,您仍需要做一些事情(如果原始位置为0)

所以正确的代码可能

 if (int.TryParse(integerLine, out integer) && int.TryParse(positionLine, out position) && int.TryParse(valueLine, out value)) // Try to parse the strings as integers
            {

                int mask= (1<< position);
                int temp = mask | integer;
                int mask2 = ~((1-value)<<position);
                int result = mask2 & temp;
                result  = mask & result;
                Console.WriteLine("(n) After bit conversion = {0}", result);

            }