你怎么算在另一个基地?

时间:2009-05-07 03:50:09

标签: c# binary

假设我想用二进制计数,直到我拥有一个设定字节数的最高数字,我怎么能这样做?感觉应该有一个非常简单的方式,我只是不知道它。我用谷歌搜索,但很惊讶没有找到任何例子。

例如,如果我想要计数到1个字节,我将从00000001开始添加1并获得00000010,添加1以获得00000011等,直到我到达11111111.

另外,你怎么能用十六进制呢?你从0x00开始,加一个输出0x01,0x02,0x03等,直到你得到0xFF?

另外,如何将值输出为字符串(如我的示例)?

一些伪代码:

byteSize = 3
counter = 0
    while counter.size <= byteSize
      print counter /* prints 00000001, 00000010, etc. 
      count += 1
    loop

更新

我不仅关心在另一个基地显示一个数字,这只是其中的一部分。我看到我的错误,因为显示功能决定了数字的显示方式(正如Jeremy指出的那样)。所以,这部分不是问题。

更新2:

我保证我不是一个完整的白痴。以下是上下文:

今天我开始在reddit上看到这个: http://www.elliottkember.com/kember_identity.html

然后,这个: http://www.reddit.com/r/programming/comments/8iguu/md5_gamechallenge_for_you_reddit/

导致了这个: http://www.olegkikin.com/md5game/

所以,我想你可以从不同的时间间隔开始计算比特,然后让它们运行。

3 个答案:

答案 0 :(得分:6)

二进制

for (int i = 0; i <= byte.MaxValue; i++)
{
    Console.WriteLine(Convert.ToString(i, 2).PadLeft(8, '0'));
}

十六进制

for (int i = 0; i <= byte.MaxValue; i++)
{
    Console.WriteLine("0x" + i.ToString("X").PadLeft(2, '0'));
}

for (int i = 0; i <= byte.MaxValue; i++)
{
    Console.WriteLine(Convert.ToString(i, 16).PadLeft(2, '0'));
}

多个字节

int numBytes = 3;
for (int i = 0; i < Math.Pow(2, numBytes * 8); i++)
{
    Console.WriteLine(Convert.ToString(i, 2).PadLeft(numBytes * 8, '0'));
}

我不会超过3,或者你会等很长时间......

对更新的回应:

我希望你开玩笑说“在二进制中计算20个字节”。这是160位。这会创建一个数字列表,其中包含整个宇宙中的原子数范围内的某个计数。我希望你有足够的时间(即千年谷歌)等待完成:)

答案 1 :(得分:5)

您正在“计算”的基础完全取决于将数字输出到屏幕的功能(或在执行此操作之前将其转换为字符串)。不同的基础只是视觉上表示相同数字的不同方式。因此,要以二进制“计数”,您只需告诉您的数字到字符串函数使用基数2而不是默认基数10.

答案 2 :(得分:1)

任意深度。

如果这样做有意义,可以轻松将其切换为64位(例如,64位处理器)。

注意:这完全是徒手,我没有编译它,也没有,显然,测试它。我甚至无法猜测,如果您执行超过5个32位计数器,打印出2 ^ 160个值(即1.46e48值)或更长时间需要多长时间。

这非常低效,但是到底是什么。

// A word is 32-bits
void CountBytes(int numberOfWords)
{
    uint[] numbers = new uint[numberOfWords];

    while(true)
    {
        // Show most-significant first
        for (int i=numbers.Length-1; i>=0; i--)
        {
            Console.Write(Convert.ToString(numbers[i], 2).PadLeft(32, '0'));
        }

        // Hit max on all uint's, bail
        bool done = true;
        for (int i=numbers.Length-1; i >= 0; i--)
        {
            if (numbers[i] != uint.MaxValue)
            {
                done = false;
                break;
            }
        }
        if (done)
        {
            break;
        }

        // Check for overflow
        for (int i=numbers.Length-2; i >= 0; i--)
        {
            // Overflow for numbers[i] is if it and all beneath it are MaxValue
            bool overflow = true;
            for (int k=i; k>=0; k--)
            {
                if (numbers[k] != uint.MaxValue)
                {
                    overflow = false;
                    break;
                }
            }

            if (overflow)
            {
                numbers[i+1]++;
                numbers[i] = 0;
            }
        }

        // Increment counter
        numbers[0]++;
    }
}