【问题标题】:How do you count in another base?你如何计算另一个基地?
【发布时间】:2009-05-13 20:12:18
【问题描述】:

假设我想以二进制计数,直到我拥有一组字节数可以容纳的最高数字,我该怎么做?感觉应该有一个非常简单的方法,我只是不知道。我用谷歌搜索,但很惊讶没有找到任何示例。

例如,如果我想计数到 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

更新:

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

更新 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/

所以,我想你可以从不同的时间间隔开始数位,然后让他们运行。

【问题讨论】:

  • 你的意思是“我如何将一个数字表示为一个不是 10 的基数的字符串?”?
  • 没有理由计算位来生成 MD5,只需从一个随机的 32 字节字符串开始并对其执行散列,因为这将是您的“最佳”机会。找到一个确切的身份将需要连续 5 次赢得 Megamillions 彩票的好运——这当然假设恰好存在 1 个固定点(据我们所知,一开始就存在一个固定点的可能性只有 67%)跨度>
  • @John,我不在乎该值是否确实存在,或者是否可以找到。应该很有趣。

标签: c# binary


【解决方案1】:

二进制

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位。这将创建一个数字列表,其计数范围为整个宇宙中的原子数。我希望你有足够的时间(即千禧年的 googols)来等待它完成:)

【讨论】:

  • 好的,那是1字节,2或3字节呢。
  • 呃,增加循环的上限并相应地向左填充?
  • 这似乎只适用于某些碱基(2、8、10、16)。如果 OP 想要更通用的东西......让 x 是一个整数, b 是基数。 x%b 是您的表示中的最低位, x /= b 将向下移动。等等……
  • 是的,但是当我到达 2147483647 时,你会滚动到 -2147483648,而不是 2147483648。所以,你可以使用 UInt64,但是在 UInt64.MaxValue 之后你将如何处理它?
  • 哈哈,最终的计划是到 32 岁!
【解决方案2】:

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

【讨论】:

  • 我知道它们是相同的数字,并且显示功能决定了它的显示方式(doh)是有道理的。如果我的计数变量是一个无符号整数,那么它可以容纳的最大值是 4 字节的二进制数据(1111111111111111111111111111111)或 4294967295。那么,我如何继续以二进制数来表示 20 字节?
  • 你刚才说的是完全不同的问题,你本来就应该这么说的。要继续数数,只需想想您通常是如何数数的:如果空间用完了,则转到下一列。例如,如果要计数,可以只使用嵌套循环,一个用于高字,另一个用于低字。
  • 不,我指定了“一组字节数”,我的示例只有 1 个字节,所以我没有用 1 填充页面。
【解决方案3】:

对于任意深度。

如果有意义的话,您可以轻松地将其切换到 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]++;
    }
}

【讨论】:

  • 这是我一直在寻找的一种方法,但我敢打赌,有一种方法可以实现它,这样您就不必在添加更多字节时添加更多条件。
  • 我做了检查,所以它可以是任意数量的单词。仍然未经测试和编译。
猜你喜欢
  • 1970-01-01
  • 2010-12-23
  • 2021-07-15
  • 1970-01-01
  • 2016-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-06
相关资源
最近更新 更多