我需要在C#中以十进制,十六进制,八进制和二进制的形式显示“Joshua”的每个字符的值,以用于学校作业。请帮忙!
到目前为止,我只能显示我的名字......
namespace CharFormat
{
class Program
{
static void Main(string[] args)
{
char letter1;
letter1 = 'J';
System.Console.Write(letter1);
char letter2;
letter2 = 'o';
System.Console.Write(letter2);
char letter3;
letter3 = 's';
System.Console.Write(letter3);
char letter4;
letter4 = 'h';
System.Console.Write(letter4);
char letter5;
letter5 = 'u';
System.Console.Write(letter5);
char letter6;
letter6 = 'a';
System.Console.Write(letter6);
System.Console.ReadLine();
}
}
}
答案 0 :(得分:1)
如果您不介意我建议您完全改变您的方法,我会在下面找到解决方案。
string name = "Joshua";
char[] characters = name.ToCharArray(); //many ways to do this, just first that comes to mind
foreach (char c in characters)
{
Console.WriteLine("Decimal: " + Convert.ToByte(c).ToString());
Console.WriteLine("Character: " + c.ToString());
Console.WriteLine("Other representation: " + Convert.YouFigureThisPartOut(c).ToString());
//ect
}
基本思想是,不是编写50 if语句,而是将字符放入数组中,使用相同的4或5行代码循环遍历它,以进行转换和打印。
答案 1 :(得分:0)
一些提示,假设这个练习的目的是教你一点点。
string
[基本上]是char
。char
是一个16位无符号整数(ushort
)。一旦你有了这个积分值,转换为[不同基数的文本表示]非常简单。转换为二进制,八进制或十六进制,因为这些都是2次幂的基数只是位移和屏蔽的问题。转换为十进制(基数为10)涉及除法。
以下是一些最少使用内置转换/格式化实用程序的示例。
转换为十六进制(基数为16)。十六进制是表示二进制值的便捷简写。它采用4个组中的位('半字节'),因此每个十六进制“数字”具有16个值(0-15)的范围。转换是以4为单位进行移位和屏蔽的问题。由于我们正在移动和屏蔽,我们可以按顺序构建结果:
private static string CharToHexString( char c )
{
StringBuilder sb = new StringBuilder();
int codePoint = (ushort) c ;
int shiftAmount = 16 ;
do
{
shiftAmount -= 4 ;
// shift the value the correct number of bits to the right and mask off everthing but the low order nibble
int nibble = (codePoint>>shiftAmount)&0x000F ;
sb.Append( "0123456789ABCDEF"[nibble] ) ;
} while ( shiftAmount > 0 ) ;
string value = sb.ToString() ;
return value ;
}
转换为八进制(基数为8)与转换为十六进制基本相同。区别在于半字节大小为3位,因此数字的域为0-7(8个值):
private static string CharToOctalString( char c )
{
StringBuilder sb = new StringBuilder();
int codePoint = (ushort) c ;
int shiftAmount = 18 ; // has to be integral multiple of nibble size
do
{
shiftAmount -= 3 ;
// shift the value the correct number of bits to the right and mask off everthing but the low order nibble
int nibble = (codePoint>>shiftAmount)&0x0007 ;
sb.Append( "01234567"[nibble] ) ;
} while ( shiftAmount > 0 ) ;
string value = sb.ToString() ;
return value ;
}
转换为二进制(基数2)同样基本上与上面相同,半字节大小为1位:
private static string CharToBinaryString( char c )
{
StringBuilder sb = new StringBuilder();
int codePoint = (ushort) c ;
int shiftAmount = 16 ;
do
{
shiftAmount -= 1 ;
// shift the value the correct number of bits to the right and mask off everything but the low order nibble
int nibble = (codePoint>>shiftAmount)&0x0001 ;
sb.Append( "01"[nibble] ) ;
} while ( shiftAmount > 0 ) ;
string value = sb.ToString() ;
return value ;
}
转换为十进制(基数为10)。这有点不同,因为基数不是2的幂。这意味着我们必须使用除法以相反的顺序剥离数字,从低位数字开始。为此,我们将使用Stack<T>
,因为堆栈是LIFO(后进先出)数据结构,它将使用我们需要的反转质量。为此:
private static string CharToDecimalString( char c )
{
Stack<char> digits = new Stack<char>() ;
int codePoint = (ushort) c ;
do
{
int digit = codePoint % 10 ; // modulo 10 arithmetic gives us the low order digit
codePoint = codePoint / 10 ; // integer division by 10 shifts the lower order digit off
digits.Push("0123456789"[digit]);
} while ( codePoint > 0 ) ;
string value = new string( digits.ToArray() ) ; // this pops the entire stack, thus reversing the digits.
return value ;
}