【问题标题】:display letter, decimal, hexadecimal, octal, binary显示字母、十进制、十六进制、八进制、二进制
【发布时间】:2014-03-11 12:17:39
【问题描述】:

我需要在 C# 中以十进制、十六进制、八进制和二进制显示“约书亚”每个字符的值,以用于学校作业。请帮忙!

到目前为止,我只能显示我的名字...

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();
        }
    }
}

【问题讨论】:

标签: c# binary decimal octal


【解决方案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 行代码循环遍历它来进行转换和打印。

【讨论】:

    【解决方案2】:

    一些提示,假设这个练习的目的是教你一些小技巧。

    • string [本质上] 是 char 的序列。
    • char 实际上是一个 16 位无符号整数 (ushort)。

    一旦你有了这个整数值,转换为不同基的 [文本表示] 就非常简单了。转换为二进制、八进制或十六进制,因为这些都是 2 的幂次方,只是位移和掩码的问题。转换为十进制(以 10 为底)涉及除法。

    以下是一些使用内置转换/格式化实用程序最少的示例。

    转换为十六进制(Base 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 ;
    }
    

    【讨论】:

    • 这让我清楚地知道我需要做什么来完成我的任务。非常感谢!完成作业后,我会发布我的最终结果。
    猜你喜欢
    • 1970-01-01
    • 2012-12-12
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    • 2014-10-30
    相关资源
    最近更新 更多