PDA

View Full Version : گفتگو: برنامه نویسی اعداد Hex و بلند



A.S.Roma
دوشنبه 31 تیر 1387, 16:54 عصر
سلام

می خوام برنامه ای بنویسم که در اون از اعداد Hex-Decimal استفاده می شود ... مقادیر هم معمولا 16 بایتی یا 32 بایتی هستند ...

مثل ( "0x1234567890ABCDEF " )

راستش تا به حال اینجوری برنامه ننوشتم :افسرده:. یکم کمک می خوام که چطوری با این مقادیر بازی کنم .

تو برنامه خیلی نیاز دارم اینها رو ببرم تو مبنای 2 و یه سری بلا سرشون بیارم و دوباره مبنای 16 کنم ...
می خواستم ببینم خود ++C چیزی برای این مدل برنامه نویسی داره یا باید همه چیز رو خودم تعریف کنم !؟
به نظرتون یه کلاس جدا باید فقط واسه Data Type هام بنویسم ؟! ( اگه نظرتون مثبته این کلاسها چه چیزهایی توش داشته باشه !؟ ؛ مثلا کلاس اعداد باینری! )

ممنون !

Nima_NF
دوشنبه 31 تیر 1387, 19:15 عصر
شما داده ها را حتی اگر به شکل هگز و رشته از ورودی دریافت می کنید آن ها را در یک متغیر مثل int یا double ذخیره کنید، چرا که معادل هم هستند.
عددی هگزی که شما در بالا مثال زدید 64 بیتی هست و فقط کامپایلرهای جدید آن ها را به صورت صحیح قادر به ذخیره کردن هستند (متغیر double هم تا نزدیک مقدار عددی صحیح آن را می تواند ذخیره کند)

پس عدد هگز را به صورت رشته ذخیره کنید و سپس آن را با توابع strtoul یا strtol و مانند آن، به سایر انواع باینری، دسیمال ، هگز تبدیل و در متغیر عددی ذخیره کنید:



#include <stdlib.h>
char str[] = "ABF1";
char *stopstring;

int num = strtol( str, &stopstring, 16 ); // base 16 for hex
cout << num;

ضمنا برای نمایش هم می توانید به شکل زیر عمل کنید (بدون محاسبه جداگانه):



printf( "Hex: %Xh C hex: 0x%x Octal: %o\n",
num ,num , num );

ضمنا به شکل فوق هم با تابع sprintf می توانید اعداد تبدیل شده را در متغیرهای دیگر قرار داده و ذخیره کنید.

A.S.Roma
دوشنبه 31 تیر 1387, 19:34 عصر
خیلی ممنون از لطفتان ... ( خیلی کمکم کرد )


پس عدد هگز را به صورت رشته ذخیره کنید و سپس آن را با توابع strtoul یا strtol و مانند آن، به سایر انواع باینری، دسیمال ، هگز تبدیل و در متغیر عددی ذخیره کنید:

در صورت امکان تابعی که رشته را به معادل باینری می کند نیز ذکر بفرمایید ...

باز هم ممنون !

Nima_NF
دوشنبه 31 تیر 1387, 21:10 عصر
بعد از اینکه عدد دسیمال (num) را دریافت کردید با توجه به کامپایلر شما از یکی از توابع itoa یا itoa_ یا _itoa_s استفاده کنید تا مقدار باینری را محاسبه و در یک رشته قرار دهید:



char binaryStr[65];

_itoa_s( num, binaryStr, 65, 2 ); // base of number will be 2 = binary
// or use:
itoa( num, binaryStr, 2 );

radium
دوشنبه 26 اسفند 1387, 16:47 عصر
[quote=Nima_NF;557795]


#include <stdlib.h>
char str[] = "ABF1";


int num = strtol( string, &stopstring, 16 ); // base 16 for hex




[/code][/quote






نیمای عزیز. شما اسم رشته حاوی عدد مبنای 16 رو str گذاشتید. بعد پارامتر اول strtol را string نوشتید. متوجه نمیشم.
(به جای string من str گذاشتم بازم ارور داد. )
کلا سوال من اینه که من یه رشته دارم که توش عدد مبنای 16 هست چه طور میتونم به عدد مبنای 10 تبدیلش کنم.؟

Nima_NF
دوشنبه 26 اسفند 1387, 21:57 عصر
نیمای عزیز. شما اسم رشته حاوی عدد مبنای 16 رو str گذاشتید. بعد پارامتر اول strtol را string نوشتید. متوجه نمیشم.
(به جای string من str گذاشتم بازم ارور داد. )
کلا سوال من اینه که من یه رشته دارم که توش عدد مبنای 16 هست چه طور میتونم به عدد مبنای 10 تبدیلش کنم.؟بله منظور همان str بود، مثال اول را تکمیل کردم (همان تاپیک را ویرایش کردم). شما بایستی پارامتر دوم را نیز به شکل یک اشاره گر به رشته تعریف می کردید تا خطاها را دریافت کنید.

وقتی پارامتر سوم را 16 می نویسید عدد معادل مبنای 10 آن در num قرار می گیرد.( یعنی عدد را از مبنای 16 به 10 تبدیل می کند)