2016-04-13 9 views
1

tamsayısına geri dönüyorum Şimdi aradı ve deney yaptım. İstediğimi yapmak için karşılaştığım çözümlerden herhangi birini adapte edemedim.C++ tamsayı 8 char hex'e dönüştürün, ilk iki karakteri bırakın, böylece sadece 6 karakterlik bir hex ve

Amacım bir tam sayı (538214658) alıp onu 8 karakterlik bir hex dizesine dönüştürmektir (020148102). Sonra ilk iki karakteri (0148102) bırakmak ve bir harita dizisinde anahtar olarak kullandığım bir tamsayıya (1343746) dönüştürmek istiyorum.

Şimdiye kadar gördüğüm çözümler sadece bir tamsayıyı hex dizesine dönüştürür, ancak istenen rakam uzunluğunu dikkate almaz.

Console_Print("%06X", form ? form->refID : 0) 

Yani belki bir dizeye depolamak için bu tekniği kullanabilirsiniz düşündüm ve sonra iostream veya sstream kullanın: Aşağıdaki kodu kullanarak sadece ilk 6 karakteri yazdırmak mümkün duyuyorum

onu bir tamsayıya dönüştürmek için kullanıyorum, ancak aramalarımın hiçbiri kullanamayacağım bir şey ortaya koymadı. Ve tüm deneylerim başarısız oldu.

Bazı yardımlar büyük memnuniyetle karşılanacaktır.

DÜZENLEME:

uint32_t GetCoreRefID(TESForm* form) 
{ 
    uint32_t iCoreRefID = 0; 
    if (form) 
    { 
     uint32_t iRefID = (uint32_t)(form->refID); 
     iCoreRefID = iRefID & 0x00ffffff; 
    } 
    return iCoreRefID; 
} 
+0

İlk önerinizde olduğu gibi kısa bir şekilde de yazabilirsiniz: 'dönüş formu? 0x00ffffff & (form-> refID): 0'. Hangi tipin form-> refID olduğu hakkında hiçbir fikrim yok, ancak ek bir cast olmadan çalışmalı. Ama bu böyle bir '' '' 'operatör :-) 'demek değil, çözüm okumak daha kolay ve derleyici inanıyorum aynı kodu üretecektir. – Klaus

cevap

6

bir dize gösterimine dönüştürmek için gerek yoktur: Aşağıda Klaus'un öneri göre benim çözümdür.

int main() 
{ 
    uint32_t val = 538214658 & 0x00ffffff; 
    std::cout << std::hex << val << std::endl; 
    std::cout << std::dec << val << std::endl; 

} 

Bir değer hala sadece bir değerdir ve ondalık veya hex gibi temsil bağımlı olmadığını öğrenmek zorunda:

şu örneği bakın. Bir bellek alanında veya bir kayıtta kayıtlı değer hala aynıdır.

Verilen örnekte görebildiğiniz gibi, ondalık değer temsilinizi yazdım ve ilk iki onaltılık rakamı, bir maskenin onaltılık gösterimi ile bitwise and işlemi yaparak basitçe kaldırdım. Ayrıca, iki farklı "modda" olan cout'lu baskının değeri de değiştirmediğini ve içsel gösterimi de etkilemediğini anlamak zorundasınız. std::dec ve std::hex ile ostream nesnesine int göstergesinden bir dize nasıl oluşturulacağını söylersiniz.

+0

Güzel cevap. Bu Q bağlamında, bu değerleri "std :: stringstream" içine toplamak iyi olacaktır, böylece '.str()' yi kullanarak, std :: string 'biçiminde gelecekteki kullanım için kullanılabilir. – iammilind

+0

Anlayışım için, herhangi bir dize için "gelecekteki kullanım" yoktur çünkü OP'nin hedefi, bir haritanın anahtarı olarak değeri kullanmaktır. – Klaus

+0

Aslında, std :: dec/std :: hex', 'operator <<' ile destekleniyor. Şimdi bunun için ya std :: cout' nesnesini ya da herhangi bir 'std :: stringstream' nesnesini kullanabiliriz. Std :: cout' kullanılırsa, bu değer sadece konsolda basılır ve onu görebilsek de kullanamazsınız. Ancak, "stringstream" kullanılırsa, nesnenin '.str()' yöntemini kullanarak, değer herhangi bir (gelecekteki) amaç için kullanılabilir. Benim varsayımım, OP'nin muhtemelen değeri nasıl toplayacağını bilmemesidir, böylece harita anahtarı için kullanılabilir. [Deneme] (http://ideone.com/fnxsyr).Daha fazla döküm 'std :: stoi() 'geri dönmek için kullanılabilir. – iammilind

İlgili konular