假设我想用二进制计数,直到我拥有一个设定字节数的最高数字,我怎么能这样做?感觉应该有一个非常简单的方式,我只是不知道它。我用谷歌搜索,但很惊讶没有找到任何例子。
例如,如果我想要计数到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指出的那样)。所以,这部分不是问题。
我保证我不是一个完整的白痴。以下是上下文:
今天我开始在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/
所以,我想你可以从不同的时间间隔开始计算比特,然后让它们运行。
答案 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]++;
}
}