将每个第n个字符放在n-7位置的字符串中

时间:2015-02-25 18:02:44

标签: c# string

我有0和1的字符串。它看起来像这样:

1110011011010000...

有更好的可视化空间(我程序中的原始字符串不包含空格)

11100110 11010000 ...

每八个元素必须是二进制的Unicode字母。

我需要做的是,将每个字母的每个最后0或1(完整字符串中的每个第8个元素)放到这个字母的第一个位置,所以这个字符串将是这样的:

0111001101101000...

有更好的可视化空间(我程序中的原始字符串不包含空格)

01110011 01101000 ...

我怎样才能在C#中做到这一点?

5 个答案:

答案 0 :(得分:1)

首先将字符串拆分为大小为8的块(here is how)。

这会为您提供IEnumerable<string>。取每个长度为8的字符串,并重新组合它的字符:

string orig = "11100110";
string res = orig.Substring(1)+orig[0];

最后,合并以上述方式处理的部分以获取最终字符串(here is how)。

答案 1 :(得分:1)

字符串是不可变的,所以我会使用StringBuilder来移动字符

    var s =  "1110011011010000";
    var window = 8; // the tail of string which is shoreter than 8 symbols (if any) will be ignored
    System.Text.StringBuilder sb = new System.Text.StringBuilder(s);
    for(int i = 0; i <= s.Length-window; i=i+window)
    {
        char c = sb[i+window-1];
        sb.Remove(i+window-1,1);
        sb.Insert(i,c);         
    }
    string result = sb.ToString();

答案 2 :(得分:1)

这是我的解决方案。方法ShiftChunkChars采用字符串和整数来表示每个&#34; chunk&#34;中的字符数量。请注意,如果输入字符串的长度不能被chunkSize整除,则此方法不起作用。

string ShiftChunkChars(string original, int chunkSize)
{
    char[] buffer = new char[chunkSize];
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < original.Length; i += chunkSize)
    {
        char[] chars = original.Substring(i, chunkSize).ToCharArray();
        Array.Copy(chars, 0, buffer, 1, chunkSize - 1);
        buffer[0] = chars[chunkSize - 1];
        sb.Append(buffer);
    }
    return sb.ToString();
}

示例:

<强> 1

void Main()
{
    int chunkSize = 8;
    string s = "11100110110100000111001101101000";
    ShiftChunkChars(s, chunkSize);
}

输出:

01110011011010001011100100110100
// Original with spaces: 11100110 11010000 01110011 01101000
// Result with spaces:   01110011 01101000 10111001 00110100

<强> 2

void Main()
{
    int chunkSize = 4;
    string s = "11100110110100000111001101101000";
    ShiftChunkChars(s, chunkSize);
}

输出:

01110011111000001011100100110100
// Original with spaces: 1110 0110 1101 0000 0111 0011 0110 1000
// Result with spaces:   0111 0011 1110 0000 1011 1001 0011 0100

答案 3 :(得分:0)

使用Regex,你应该能够做到这一点非常简单:

string formattedBinary = Regex.Replace("0111001101101000", ".{8}", "$0 ");

答案 4 :(得分:0)

试试这个。不确定我是否理解了这个问题。在这种情况下,我循环了两次,因为我有16个字符。

string s = "1110011011010000";
char[] nc = s.ToCharArray();

for (int i = 0; i < 2; i++)
{
    char tmp = nc[i * 8 + 7];
    for (int j = 6; j > 0; j--)
    {
        nc[i * 8 + j + 1] = nc[i * 8 + j];
    }
    nc[i * 8] = tmp;
}
s = new string(nc);