我该如何转换以下内容?
2934(整数)到B76(十六进制)
让我解释一下我想做什么.我的数据库中有用户ID,存储为整数.我没有让用户引用他们的ID,而是让他们使用十六进制值.主要原因是因为它更短.
因此,我不仅需要从整数到十六进制,而且还需要从十六进制到整数.
有没有一种简单的方法在C#中执行此操作?
首先,这不是浮点新手问题.我知道浮点运算的结果(更不用说超越函数)通常不能准确表示,并且大多数终止小数不能完全表示为二进制浮点数.
也就是说,每个可能的浮点值完全对应于一个二元有理数(一个有理数p/q,其中q是2的幂),而这又有一个精确的十进制表示.
我的问题是:你如何有效地找到这个精确的十进制表示?sprintf类似的函数通常只指定多个有效数字来唯一确定原始浮点值; 它们不一定打印精确的十进制表示.我知道我使用过的一种算法,但它很慢,指数O(e^2)在哪里e.这是一个大纲:
这真的是最好的吗?我对此表示怀疑,但我不是浮点专家,我无法找到一种方法对数字的浮点表示进行基数10计算,而不会遇到不精确结果的可能性(乘以或除以除了你知道你有空闲位之外,除了2的幂之外的任何东西都是浮点数的有损操作.
我在一些在线论坛上看到了以下面试问题.对此有什么好的解决方案?
获取5 ^ 1234566789893943的最后1000位数字
如何转换"大"十六进制数字(字符串格式):
EC851A69B8ACD843164E10CFF70CF9E86DC2FEE3CF6F374B43C854E3342A2F1AC3E30C741CC41E679DF6D07CE6FA3A66083EC9B8C8BF3AF05D8BDBB0AA6CB3EF8C5BAA2A5E531BA9E28592F99E0FE4F95169A6C63F635D0197E325C5EC76219B907E4EBDCD401FB1986E4E3CA661FF73E7E2B8FD9988E753B7042B2BBCA76679
到十进制数字(字符串格式):
166089946137986168535368849184301740204613753693156360462575217560130904921953976324839782808018277000296027060873747803291797869684516494894741699267674246881622658654267131250470956587908385447044319923040838072975636163137212887824248575510341104029461758594855159174329892125993844566497176102668262139513
不使用BigIntegerClass(因为我的应用程序应该支持没有.NET Framework 4的机器)?
正如其他人所讨论的那样,GLSL缺乏任何类型的printf调试.但有时我真的想在调试着色器时检查数值.
我一直在尝试创建一个可视化调试工具.我发现如果使用sampler2D其中数字0123456789已经在等宽度中渲染的数据,可以在着色器中相当容易地渲染任意数字系列.基本上,你只是玩弄你的x坐标.
现在,要使用它来检查浮点数,我需要一个算法将a转换float
为十进制数字序列,例如您可能在任何printf实现中找到.不幸的是,据我所知这个主题,这些算法似乎需要以更高精度的格式重新表示浮点数,我不知道这似乎有可能在GLSL中我似乎有只有32位float可用.出于这个原因,我认为这个问题不是任何一般的"printf如何工作"问题的重复,而是具体关于如何使这些算法在GLSL的约束下工作.我已经看到了这个问题和答案,但不知道那里发生了什么.
我尝试过的算法并不是很好.我的第一次尝试,标记为版本A(注释掉)似乎非常糟糕:采取三个随机的例子,RenderDecimal(1.0)渲染为1.099999702,RenderDecimal(2.5)给了我,
2.599999246然后RenderDecimal(2.6)出来了2.699999280.我的第二次尝试,标志着版本B,似乎略胜一筹:1.0与2.6两者出来罚款,但RenderDecimal(2.5)仍然不匹配的一个明显的凑整5的事实,剩余的是0.099....结果显示为2.599000022.
我的最小/完整/可验证的例子,下面,从一些简短的GLSL 1.20代码开始,然后我碰巧选择了Python 2.x,只是为了编译着色器并加载和渲染纹理.它需要pygame,numpy,PyOpenGL和PIL第三方软件包.请注意,Python实际上只是样板,并且可以通过C或其他任何东西重写(尽管繁琐).只有顶部的GLSL代码对于这个问题至关重要,因此我不认为这些python或python 2.x标签会有所帮助.
它需要将以下图像保存为digits.png:

vertexShaderSource = """\
varying vec2 vFragCoordinate;
void main(void)
{
vFragCoordinate = gl_Vertex.xy;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
"""
fragmentShaderSource = """\
varying vec2 vFragCoordinate;
uniform …Run Code Online (Sandbox Code Playgroud) 任意精度有符号整数几乎总是使用符号数值表示来实现:
对符号数值的明显偏好与固定宽度有符号整数类型中对二进制补码的近乎普遍的偏好形成鲜明对比。问题是,为什么符号数值对于 BigIntegers 来说如此明显是首选?(如果您不同意前提,我欢迎反例。)
请注意,BigInteger API 通常为重要的位运算指定“如同二进制补码”语义(例如Java、Python )。这提供了与这些操作的通常含义的一致性。这并不规定实际的内部表示(仅是实现细节),但如果其他条件相同,它应该是支持在内部使用二进制补码的一点。
浮点数使用符号数值,与使用二进制补码的整数不同。不过,浮点并不是真正的指导先例,因为浮点运算的行为和算法与整数运算有很大不同。Bignum 更像整数而不是浮点数。
我们知道“教科书”上为什么补码在数学上起作用以及为什么它有优点的原因。在我看来,这些原因同样适用于整数和大整数。这在多大程度上是真的?
当然,硬件固定精度整数和软件任意精度整数的设计约束之间存在巨大差异。从这个意义上说,看到设计师在这些不同的领域做出不同的权衡一点也不奇怪。那么,应用于任意精度整数时,符号-数值和补码之间的权衡是什么?例如,这可能涉及某些重要算法的性能或简单性。
我希望您的回答能够阐明 BigInteger 算术的设计注意事项,并帮助我从新的角度重新审视我对补码的了解。
(需要明确的是:当我说任意精度整数的二进制补码时,我的意思是使用单词数组的表示,其位模式放在一起时是所需数字的二进制补码表示 - 也许还有额外的要求没有“不必要的前导 0”(对于非负数)或“不必要的前导 1”(对于负数)。)
我有一个二进制数表示为11.1111111(.类似于小数点).在该点之前有2位,在该点之后有1024位.这是一个计算e到高精度的练习,但现在我被困在如何将它转换为十进制.万一你想知道这个数字,这里是:
10.1011011111100001010100010110001010001010111011010010101001101010101111110111000101011000100000001001110011110100111100111100011101100010111001110001011000001111001110001011010011011010010101101010011110000100110110010000010001010001100100001100111111101111001100100100111001110111001110001001001001101100111110111110010111110100101111111000110110001101100011000011000111010111011000111101101000000110110010000000101010111011000100011000010111101011010011110111110001111011010101110101011111110101100101011000010010010000110011111101010001111101011111000001100110111011010000100001010110001101100101010101010011110111101101000110101111001110110101010101110001001101011110011111110101011111001001001101011001100001001111000011000111000011100000111001101000101101110111111000101010011010001001110110101111001111101111111010000111001000011101111100010101100010100001001101101010110111100111001101010011000010101100110010100100111101001000001110100111100101111010101111000000101010110001100000101011001100100100111110110011101011
Run Code Online (Sandbox Code Playgroud)
如何将其转换为2.718 ....(小数点后应该有大约309位)我不能简单地将每个位乘以2 ^ x,因为过了一会儿,数字2 ^ x将= 0,甚至当使用双精度浮子时.我使用的是Visual Basic,所以我不确定是否存在更大的变量.
[由Spektre编辑]
只需用我的代码运行你的字符串(根据我的评论中的链接),结果是:
e(bigdecimal)=2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516642742746639193200305992181741359662904357290033429526059563073813232862794349076323382988075319525101901157383418793070215408914993488416750924476146066808226480016847741185374234544243710753907774499206955170189257927265177296267786175561825444670874889747782175809270565601486538810885558129926100522647929865142359038501319247028975364903531383896590857864585070203793060262761378008328322397393650711101939331201
e (text)=2.71828182845904523536028747135266249775724709369995957496696762772407663035354759457138217852516642742746639193200305992181741359662904357290033429526059563073813232862794349076323382988075319525101901157383418793070215408914993488416750924476146066808226480016847741185374234544243710753907774499206955170189
e (reference)=2.718281828459045235360287471352662497757247093699959574966967627724076630353547594571382178525166427427466391932003059921817413596629043572900334295260595630738132328627943490763233829880753195251019011573834187930702154089149934884167509244761460668082264800168477411853742345442437107539077744992069551702761838606261331384583000752044933826560297606737113200709328709127443747047230696977209310141692836819025515108657463772111252389784425056953696770785449969967946864454905987931636889230098793127736178215424999229576351482208269895193668033182528869398496465105820939239829488793320362509443117301238197068416140397019837679320683282376464804295311802328782509819455815301756717361332069811250996181881593041690351598888519345807273866738589422879228499892086805825749279610484198444363463244968487560233624827041978623209002160990235304369941849146314093431738143640546253152096183690888707016768396424378140592714563549061303107208510383750510115747704171898610687396965521267154688957035035402123407849819334321068170121005627880235193033224745015853904730419957777093503660416997329725088687696640355570716226844716256079882651787134195124665201030592123667719432527867539855894489697096409754591856956380236370162112047742722836489613422516445078182442352948636372141740238893441247963574370263755294448337998016125492278509257782562092622648326277933386566481627725164019105900491644998289315056604725802778631864155195653244258698294695930801915298721172556347546396447910145904090586298496791287406870504895858671747985466775757320568128845920541334053922000113786300945560688166740016984205580403363795376452030402432256613527836951177883863874439662532249850654995886234281899707733276171783928034946501434558897071942586398772754710962953741521115136835062752602326484728703920764310059584116612054529703023647254929666938115137322753645098889031360205724817658511806303644281231496550704751025446501172721155519486685080036853228183152196003735625279449515828418829478761085263981395599006737648292244375287184624578036192981971399147564488262603903381441823262515097482798777996437308997038886778227138360577297882412561190717663946507063304527954661855096666185664709711344474016070462621568071748187784437143698821855967095910259686200235371858874856965220005031173439207321139080329363447972735595527734907178379342163701205005451326383544000186323991490705479778056697853358048966906295119432473099587655236812859041383241160722602998330535370876138939639177957454016137223618789365260538155841587186925538606164779834025435128
Run Code Online (Sandbox Code Playgroud)
第一个是从文本转换为我的arbnum数据类型,然后转换回文本,中间是纯文本到文本转换(如在转换为十六进制之前的链接),最后是引用e
这里是二进制字符串的十六进制字符串:
e (hex) =2.B7E151628AED2A6ABF7158809CF4F3C762E7160F38B4DA56A784D9045190CFEF324E7738926CFBE5F4BF8D8D8C31D763DA06C80ABB1185EB4F7C7B5757F5958490CFD47D7C19BB42158D9554F7B46BCED55C4D79FD5F24D6613C31C3839A2DDF8A9A276BCFBFA1C877C56284DAB79CD4C2B3293D20E9E5EAF02AC60ACC93ECEBh
Run Code Online (Sandbox Code Playgroud)
我截断了十进制半字节大小,所以最后可能会留下1,2或3位未经处理的...
我有一个字节数组和该数组的长度.目标是输出包含表示为基数为10的数字的字符串.
我的阵列是小端.这意味着first(arr[0])字节是最低有效字节.这是一个例子:
#include <iostream>
using namespace std;
typedef unsigned char Byte;
int main(){
int len = 5;
Byte *arr = new Byte[5];
int i = 0;
arr[i++] = 0x12;
arr[i++] = 0x34;
arr[i++] = 0x56;
arr[i++] = 0x78;
arr[i++] = 0x9A;
cout << hexToDec(arr, len) << endl;
}
Run Code Online (Sandbox Code Playgroud)
该数组由[0x12, 0x34, 0x56, 0x78, 0x9A].hexToDec我想要实现的函数应返回663443878930十进制数.
但是,问题是因为我的机器是32位,所以它输出2018915346(注意这个数字是从整数溢出获得的).所以,问题是因为我使用天真的方式(迭代数组并将其乘以数组256中位置的幂,然后乘以该位置的字节,最后加到总和).这当然会产生整数溢出.
我也试过long long int,但在某些时候,当然会发生整数溢出.
我希望表示为十进制数的数组可能非常长(超过1000个字节),definitelly需要比我天真的更聪明的算法.
题
实现这一目标的好算法是什么?另外,我必须问的另一个问题是该算法的最佳复杂性是什么?它可以在线性复杂度O(n)中完成,其中 …
我正在尝试将原始二进制数据从线程上下文转换为人类可读的格式,并且在尝试将四倍精度浮点值转换为C#中的可读格式时出现空白.
最后,我想用标准科学记数法显示它,例如1.234567×10 89.我并不担心过程中精度的损失 - 我只是想要了解价值是什么.
我的第一个想法是通过提高指数手动计算值为double,但当然在很多情况下我会超过最大值.我不介意失去精确度,但根本无法显示它是不可接受的.
我可以使用某种简单的数学黑客吗?
给定一个大的十进制整数,如何计算位长度,即其二进制表示的位数?
\n\n例子: bitlength("590295810358705712624") == 70
算术表达式为:bitlength = \xe2\x8c\x8alog\xe2\x82\x82(n)\xe2\x8c\x8b + 1
对于小整数,此表达式可以转换为标准库调用。但是对于具有任意位数的大整数呢?
\n\nlog\xe2\x82\x82我们可以从一位或两位前导数字计算出非常接近的估计值:
log\xe2\x82\x82(8192) \xe2\x89\xa5 log\xe2\x82\x82(8100) = log\xe2\x82\x82(81) + log\xe2\x82\x82(10) * 2 = 12.98...\nRun Code Online (Sandbox Code Playgroud)\n\n将其代入上面的算术表达式中,我们得到了一个非常好的位长度下界。但在某些情况下,我们必须检查更多数字,可能直到最不重要的数字,才能得到准确的结果:
\n\nbitlength("1125899906842623") == 50\nbitlength("1125899906842624") == 51\nRun Code Online (Sandbox Code Playgroud)\n\n关于如何在所有情况下准确有效地计算位长度有什么建议吗?
\n我试图使用Delphi代码将20位十进制值转换为十六进制.虽然我在C#中找到了下面的代码.
BigInteger bi = new BigInteger("12345678901234567890");
string s = bi.ToHexString();
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助使用等效的delphi代码来实现这一目标吗?
请注意,使用kstools代码,我能够将17位十六进制值转换为20位十进制数,但我无法将其反转以获取十六进制值.
kstool代码如下:
var
I: TksInteger;
....
I.FromString('$ABDCF123456789FE');
Result = I.AsString;
Run Code Online (Sandbox Code Playgroud) 我正在构建一个基于大整数的 C 库。基本上,我正在寻求一种快速算法将二进制表示中的任何整数转换为十进制数
我看到了 JDK 的Biginteger.toString()实现,但对我来说它看起来很重,因为它被用来将数字转换为任何基数(它对每个数字使用一个除法,在处理数千个数字时应该很慢)。
因此,如果您有任何文档/知识可以分享,我很乐意阅读。
编辑:关于我的问题的更精确:
让 P 一个内存地址
令 N 为在 P 处分配(和设置)的字节数
如何将地址 P 处的 N 个字节表示的整数(让我们以小端排列使事情更简单)转换为 C 字符串
例子:
N = 1
P = 一些存储“00101010”的随机内存地址
输出字符串 = "42"
还是谢谢你的回答