我有0和1的字符串。它看起来像这样:
1110011011010000...
有更好的可视化空间(我程序中的原始字符串不包含空格)
11100110 11010000 ...
每八个元素必须是二进制的Unicode字母。
我需要做的是,将每个字母的每个最后0或1(完整字符串中的每个第8个元素)放到这个字母的第一个位置,所以这个字符串将是这样的:
0111001101101000...
有更好的可视化空间(我程序中的原始字符串不包含空格)
01110011 01101000 ...
我怎样才能在C#中做到这一点?
答案 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);