الگوريتم بهينه تبديل اعداد مبناي 16 و 10 و 2 به يكديگر

Amit13

Well-Known Member
سلام دوستان:rose:

الگوريتم هاي تبديل اعداد مبناي 16 و 2 و 10 به يكديگه رو ميخوام.
طبق تجربتون لطفا كم دستور و bigO پايين.آخه مثلا ميخوام داخل يك حلقه ي 1000 تايي بندازمش.

مرسي:rose:
 

the_king

مدیرکل انجمن
سلام دوستان:rose:

الگوريتم هاي تبديل اعداد مبناي 16 و 2 و 10 به يكديگه رو ميخوام.
طبق تجربتون لطفا كم دستور و bigO پايين.آخه مثلا ميخوام داخل يك حلقه ي 1000 تايي بندازمش.

مرسي:rose:

bigO اش که فرق چندانی نمی کنه، به هر حال (Len(input) + Len(output است.

کد زیر رشته $s رو از مبنای n به مبنای m تبدیل کرده و در $t می نویسد، مبنا ها باید عددی بین 2 الی 16 باشند :
کد:
s$ = EditBox$
n = 16
m = 2
hexchar$ = '0123456789ABCDEF'
If (n = 10) Then
  x = VAL(s$)
Else
  k = 1
  length = LEN(s$)
  x = 0
  For i = 1 To length
    j = length - i + 1
    c$ = StrGet(s$,j)
    If (c$ > '9') Then
      c$ = UPP(c$)
      x = x + (ORD(c$) - 55)*k
    Else
      x = x + (ORD(c$) - 48)*k
    End
    k = k * n
  Next i
End
If (m = 10) Then
  t$ = CHAR(x)
Else
  t$ = ''
  For i = 1 To Infinity
    j = x - INT(x / m) * m + 1
    t$ = StrGet(hexchar$,j) + t$
    x = INT(x / m)
    If (x = 0) Then
      Break()
    End
  Next i
End
DisplayValue("EditBox1","t$")

رجوع شود به : يك درخواست
 

Amit13

Well-Known Member
واقعا مچکر خیلی عالیه.
ولی برای تبدیل اعداد منفی چکار میشه کرد؟
 

the_king

مدیرکل انجمن
واقعا مچکر خیلی عالیه.
ولی برای تبدیل اعداد منفی چکار میشه کرد؟

اینکه یک عدد منفی است یا مثبت بستگی به این داره که ما با چه شیوه ای اعداد منفی رو تعریف کردیم و از اون
مهمتر اینکه محاسبه مون چند بیتی است. مثلا 11111111 باینری هم می تونه 128- منفی یا 127- منفی یا
255 مثبت باشه، به این بستگی داره که از شیوه مکمل دو استفاده می کنیم یا نه، محاسبه مون 8 بیتی باشه یا
بزرگتر از 8 بیتی.

میشه کدی رو اضافه کرد که اگر عدد منفی بود در نظر بگیره، اما باید اول مشخص کنیم که اعداد مون چند بیتی اند.
در مثال زیر من دو شرط IF به کد اضافه کردم که محاسبه 16 بیتی در نظر گرفته بشه، اگر مبنای ورودی (n) یا
مبنای خروجی (m) دسیمال باشه، منفی بودن عدد هم در نظر گرفته میشه. در سایر مبنا ها عدد منفی علامت -
نداره و محاسبه مثبت و منفی اش فرقی نداره.

کد:
s$ = EditBox$
n = 10
m = 16
hexchar$ = '0123456789ABCDEF'
If (n = 10) Then
  x = VAL(s$)
[B][COLOR="Blue"]  If (x < 0) Then
    x = x + 65536
  End[/COLOR][/B]
Else
  k = 1
  length = LEN(s$)
  x = 0
  For i = 1 To length
    j = length - i + 1
    c$ = StrGet(s$,j)
    If (c$ > '9') Then
      c$ = UPP(c$)
      x = x + (ORD(c$) - 55)*k
    Else
      x = x + (ORD(c$) - 48)*k
    End
    k = k * n
  Next i
End
If (m = 10) Then
[B][COLOR="Blue"]  If (x > 32767) Then
    x = x - 65536
  End[/COLOR][/B]
  t$ = CHAR(x)
Else
  t$ = ''
  For i = 1 To Infinity
    j = x - INT(x / m) * m + 1
    t$ = StrGet(hexchar$,j) + t$
    x = INT(x / m)
    If (x = 0) Then
      Break()
    End
  Next i
End
DisplayValue("EditBox1","t$")
 

BEHESHT

Well-Known Member
فرقی داره باید متمم و یا مکملشون رو پیدا کنی اگه توضیحی اجمالی بخوام بدم برای باینری (دودویی) بیاد به این شکل متممش رو پیدا کنی :

از سمت چپ بری به راست اولین یکی که دیدی رو نگه داری بقیه رو برعکس کنی :

011001000
متمم:
100111000

100010001
011101110

0001
1111

و غیره بحث پیرامون این مسائله گسترده هستش پیشنهاد می کنم کتاب مبانی دیجتال موریس مانو رو بخونی فصل اول راجع به همه اینا توضیح داده.

موفق باشی
 

جدیدترین ارسال ها

بالا