如何翻转C#中的位?

时间:2016-01-21 02:52:42

标签: c# bit-manipulation

我有一个字符串形式的二进制数

string input = "10110101101";

现在我需要翻转(0 to 11 to 0前3位

结果输出 010 10101101

如何在C#中执行此操作?

5 个答案:

答案 0 :(得分:6)

这有效:

string input = "10110101101";

string output =
    new string(
        input
            .Take(3)
            .Select(c => c == '0' ? '1' : '0')
            .Concat(input.Skip(3))
            .ToArray());

它给出了结果:

01010101101

另一种方法是:

string input = "10110101101";
string flips = "11100000000";

int value = Convert.ToInt32(input, 2) ^ Convert.ToInt32(flips, 2);

string output = Convert.ToString(value, 2).PadLeft(input.Length, '0');

答案 1 :(得分:2)

从字符串中取出StringBuilder,翻转最初的三个字符,然后将StringBuilder转换回string

var sb = new StringBuilder(input);
Debug.Assert(sb.Length >= 3);
for (int i = 0 ; i != 3 ; i++) {
    sb[i] = sb[i] == '0' ? '1' : '0';
}
var res = sb.ToString();

有各种“智能”的方法可以无条件地翻转字符,但考虑到数字是string使得翻盖更智能,不会给你带来太多的CPU周期。

Demo.

答案 2 :(得分:1)

假设您获得了一个大小为N的数组a。数组的元素是a[0], a[1], ... a[N - 1],其中每个元素都是01。您可以对阵列执行一次转换:选择任意两个整数LR,并翻转(包括)第L和第R位之间的所有元素。换句话说,L和R表示最左侧和最右侧的索引,用于划分您将决定翻转的段的边界。 ('翻转'意味着,0转换为11转换为0。) 在最终的位串中可以获得的最大“1”位数(由S表示)是多少? 输入格式: 第一行有一个整数N. 接下来的N行包含数组中的N元素a[0], a[1], ... a[N - 1],每行一个。

例如考虑

1 ≤ N ≤ 100,000. 

d can be either 0 or 1. It cannot be any other integer.
0 ≤ L ≤ R < N
Sample Input:
810010010
Sample Output:
6
Explanation:
We can get a maximum of 6 ones in the given binary array by performing either of the following operations:
Flip [1, 5] ⇒ 1 1 1 0 1 1 1 0
or 
Flip [1, 7] ⇒ 1 1 1 0 1 1 0 1

<强>解决方案: bits数组只包含0和1.所以我们可以将0视为-1,然后任务是查找 subArray的最小总和(以位为单位),即subArray的最大值 (0的数量 - 1的数量)。 我们可以使用与查找最大和subArray相同的方法来查找最小和subArray。在那之前, 我们需要首先遍历位以获得1的原始数。假设最小总和是minRes和 原始数量为1是currentOne。那么minRes应该是一个负数,所以返回currentOne-minRes。 边缘情况: 可以使用上述方法处理所有边缘情况。如果所有元素都是0,那么我们将所有-1加在一起。 如果所有元素都是1,则minRes应为0,这意味着我们不会翻转任何位。 时间:O(n)空间:O(1)

using System;
using System.Linq;

public class Test
{
    public static int FlippingBits(int[] bits){
        int currentOne = 0; //original number of 1s in bits
        foreach(int i in bits){
            if(i==1)
                currentOne++;
        }
        int minRes = MinSubArray(bits); //minRes is negative number
        return currentOne-minRes;
    }

    //find the min sum of subArray in bits
    private static int MinSubArray(int[] bits){
        int minRes = 0, minHere=0;
        foreach(int i in bits){
            if(i==0)
                minHere-=1;
            else
                minHere+=1;
            minHere = Math.Min(minHere,0); //keep minHere<=0
            minRes = Math.Min(minHere, minRes);
        }
        return minRes; //-minRes is the number of 1 can be added to the array after flipping
    }

    public static void Main()
    {
        int num = int.Parse(Console.ReadLine());
        for(int i=0;i<num;i++){
            string[] input = Console.ReadLine().Split();
            int[] bits = input.Select(y=>int.Parse(y)).ToArray();
            Console.WriteLine(FlippingBits(bits));
        }
    }
}

答案 3 :(得分:1)

使用error error error error error Convert.ToInt32(其他未知和未使用过的)和Convert.ToString

的替代方法
bitwise-XOR

只需使用string input = "10110101101"; int flipNo = 3; int output = Convert.ToInt32(input, 2); for (int i = input.Length - 1; i >= input.Length - flipNo; --i) output ^= 1 << i; ,或者如果您想在output中显示output,就可以:

string

答案 4 :(得分:-2)

解决方案非常简单;只是XOR值为1(0也可以)。

步骤:

  1. 对于前x个字符,XOR为1并获取返回值(简单的循环)。
  2. 将旧字符串替换为新字符串。