කුඩා එන්ඩියන් ආකෘතියේ වාසිය කුමක්ද?


151

ඉන්ටෙල් ප්‍රොසෙසර (සහ තවත් සමහරක්) ගබඩා කිරීම සඳහා කුඩා එන්ඩියන් ආකෘතිය භාවිතා කරයි.

යමෙකුට බයිට් ප්‍රතිලෝම අනුපිළිවෙලට ගබඩා කිරීමට අවශ්‍ය වන්නේ මන්දැයි මම නිතරම කල්පනා කරමි. විශාල එන්ඩියන් ආකෘතියට වඩා මෙම ආකෘතියට වාසි තිබේද?


1
6502 යනු මුල් (පළමු?) නල මාර්ග සකසනයකි. නල මාර්ගය හේතුවෙන් කාර්ය සාධනය හා සම්බන්ධ යම් ගැටලුවක් සඳහා එය එතරම් සීමිත නොවන බවට සමහර ප්‍රකාශයන් මට මතක ඇති බව පෙනේ - නමුත් එම ප්‍රශ්නය කුමක් විය හැකිදැයි මට දැන් අවබෝධයක් නැත. යෝජනා තිබේද?
ස්ටීව් 314

1
@ ස්ටීව් 314: නල මාර්ගගත සී.පී.යූ එකක ක්‍රියාකාරීත්වයට එන්ඩියන් උදව් කරන්නේ කෙසේද යන්න මගේ පිළිතුර පැහැදිලි කරයි: programmmers.stackexchange.com/q/95854/27874
මාටින් විල්කන්ස්

3
පුංචි-එන්ඩියන්, බිග්-එන්ඩියන් - ඔබ එකක් හෝ වෙනත් එකක් තෝරා ගත යුතුය. පාරේ වම් හෝ දකුණු පැත්තේ රිය පැදවීමක් වගේ.

3
6502 හෝ Z80 වැනි "පැරණි පාසල්" ගෘහ නිර්මාණ ශිල්පයක් සඳහා ASM හි යම් කේතයක් ලිවීමට මම ඔබට යෝජනා කරමි. මේවා කුඩා එන්ඩියන් භාවිතා කරන්නේ මන්දැයි ඔබ වහාම දකිනු ඇත. විශාල එන්ඩියන් භාවිතා කරන ගෘහ නිර්මාණ ශිල්පයට ඒවායේ උපදෙස් මාලාවට යම් ලක්ෂණ ඇත, ඒ වෙනුවට එම ආකෘතිය වඩාත් සුදුසු වේ. එය අත්තනෝමතික තීරණයක් නොවේ!
ස්ටෙෆාන් පෝල් නොක්

2
සෑම බයිට් ඇණවුම් පද්ධතියකටම එහි වාසි ඇත. කුඩා-එන්ඩියන් යන්ත්‍ර මඟින් අනෙක් ඒවා කියවීමකින් තොරව අවම බයිට් එක මුලින්ම කියවීමට ඔබට ඉඩ සලසයි. ඔබට සංඛ්‍යාවක් අමුතුද නැතිනම් (අන්තිම බිට් 0) ඉතා පහසුවෙන් පරීක්ෂා කළ හැකිය, ඔබ එවැනි දෙයකට පිවිසෙන්නේ නම් එය සිසිල් වේ. බිග්-එන්ඩියන් පද්ධති දත්ත මතකයේ ගබඩා කරන්නේ අප මිනිසුන් දත්ත (වමේ සිට දකුණට) සිතන ආකාරයටම වන අතර එමඟින් පහත් මට්ටමේ නිදොස්කරණය පහසු කරයි.
කෝරේ ටුගෙයි

Answers:


205

දෙයාකාරයෙන්ම තර්ක තිබේ, නමුත් එක් කරුණක් නම්, කුඩා එන්ඩියන් පද්ධතියක, මතකයේ දී ඇති අගයක ලිපිනය 32, 16 හෝ 8 බිට් පළල ලෙස ගත් විට සමාන වේ.

වෙනත් වචන වලින් කිවහොත්, ඔබට මතකයේ බයිට් දෙකක අගයක් තිබේ නම්:

0x00f0   16
0x00f1    0

එම '16' බිටු 16 ක අගයක් ලෙස (බොහෝ බිට් 32 පද්ධතිවල සී 'කෙටි') හෝ 8-බිට් අගයක් ලෙස (සාමාන්‍යයෙන් සී 'චාර්') වෙනස් කරන්නේ ඔබ භාවිතා කරන උපදෙස් පමණි - ඔබ ලබා ගන්නා ලිපිනය නොවේ සිට.

විශාල-එන්ඩියන් පද්ධතියක, ඉහත සඳහන් පරිදි:

0x00f0    0
0x00f1   16

ඔබට දර්ශකය වැඩි කිරීමට අවශ්‍ය වන අතර පසුව නව අගය මත පටු ලබා ගැනීමේ ක්‍රියාවලිය සිදු කළ යුතුය.

ඉතින්, කෙටියෙන් කිවහොත්, 'කුඩා එන්ඩියන් පද්ධතිවල, කැස්ට් යනු කිසිදු විකල්පයක් නොවේ.'


3
ඇත්ත වශයෙන්ම, ඔබ කියවා නැති ඉහළ පෙළේ බයිට් සාධාරණ ලෙස නොසලකා හැරිය හැකි යැයි උපකල්පනය කිරීම (උදා: ඒවා කෙසේ හෝ ශුන්‍ය බව ඔබ දන්නවා).
ස්ටීව් 314

11
@ ස්ටීව් 314: මම 2 හි අනුපූරක පද්ධතියක් මත බිට් 32 සිට 16 දක්වා (උදා) සී අවතක්සේරු කරන්නේ නම් - පද්ධති වලින් බහුතරයක් - නොසලකා හැරීමට බයිට් ශුන්‍ය විය යුතු නොවේ. ඒවායේ වටිනාකම කුමක් වුවත් මට ඒවා නොසලකා හැර සී ප්‍රමිතිය හා ක්‍රමලේඛකයාගේ අපේක්ෂාවන්ට අනුකූල විය හැකිය.

9
R ස්ට්‍රිට්සින්ගර් - අපි කතා කරන්නේ සම්පාදකයෙකු විසින් ජනනය කරන ලද එකලස් කිරීම / යන්ත්‍ර කේතය ගැන වන අතර එය අතේ ගෙන යා නොහැක. සම්පාදනය කිරීම සඳහා ඉහළ මට්ටමේ භාෂා කේතය අතේ ගෙන යා හැකි ය - එය විවිධ ගෘහ නිර්මාණ ශිල්පයේ විවිධ මෙහෙයුම් සඳහා සම්පාදනය කරයි (සියලු මෙහෙයුම් වලදී මෙන්).
jimwise

7
මම මෙම තර්කය මිලට නොගනිමි, මන්ද විශාල-එන්ඩියන් ගෘහ නිර්මාණ ශිල්පය මත, දර්ශකය ආරම්භයට වඩා අවසානයට යොමු කළ හැකි අතර, ඔබ සඳහන් කරන ඕනෑම දෙයක සහ ඔබට හරියටම එකම වාසියක් ඇත.
dan_waterworth

4
@dan_waterworth එතරම් නොවේ - නිදසුනක් ලෙස C හි දර්ශක අංක ගණිත රීති මතක තබා ගන්න, ඔබ එකම දර්ශකයේ වැඩි කිරීම් හෝ අඩු කිරීම් සිදු වූ විට කුමක් සිදුවේද? ඔබට සංකීර්ණත්වය ගෙන යා හැකිය, නමුත් ඔබට එය ඉවත් කළ නොහැක.
jimwise

46

යමෙකුට බයිට් ප්‍රතිලෝම අනුපිළිවෙලට ගබඩා කිරීමට අවශ්‍ය වන්නේ මන්දැයි මම නිතරම කල්පනා කරමි.

බිග්-එන්ඩියන් සහ කුඩා එන්ඩියන් යනු මිනිස් දෘෂ්ටිකෝණයකින් “සාමාන්‍ය අනුපිළිවෙල” සහ “ප්‍රතිලෝම අනුපිළිවෙල” පමණි, එවිට මේ සියල්ල සත්‍ය නම් පමණි ...

  1. ඔබ තිරයේ හෝ කඩදාසි මත අගයන් කියවමින් සිටී.
  2. ඔබ පහළ මතක ලිපින වම් පසින් ද ඉහළ ඒවා දකුණු පසින් ද තබන්න.
  3. ඔබ ලියන්නේ හෙක්ස් වලින්, ඉහළ ඇණවුම් වම් පසින් හෝ ද්විමය, වම්පස වඩාත්ම වැදගත් බිට් සමඟ.
  4. ඔබ වමේ සිට දකුණට කියවනවා.

ඒවා සියල්ලම CPU එකකට කිසිසේත්ම වැදගත් නොවන මානව සම්මුතීන් වේ. ඔබ # 1 සහ # 2 රඳවා තබා # 3 පෙරළා දැමුවහොත්, අරාබි හෝ හෙබ්‍රෙව් භාෂාව කියවන අයට දකුණේ සිට වමට ලියා ඇති කුඩා එන්ඩියන් “පරිපූර්ණ ස්වාභාවික” යැයි පෙනේ.

බිග්-එන්ඩියන් අස්වාභාවික යැයි පෙනෙන වෙනත් මානව සම්මුතීන් ඇත, වැනි ...

  • "ඉහළ" (වඩාත්ම වැදගත්) බයිට් "ඉහළ" මතක ලිපිනයේ තිබිය යුතුය.

මම වැඩිපුරම 68K සහ PowerPC ක්‍රමලේඛනය කරන විට, බිග්-එන්ඩියන් "හරි" සහ කුඩා එන්ඩියන් "වැරදි" ලෙස මම සලකමි. නමුත් මම වැඩි ARM සහ Intel වැඩ කරන බැවින්, මම කුඩා එන්ඩියන් වලට පුරුදු වී සිටිමි. එය ඇත්තෙන්ම කමක් නැත.


32
ඉලක්කම් ඇත්ත වශයෙන්ම අරාබි සහ හෙබ්‍රෙව් භාෂාවෙන් [වඩාත්ම වැදගත් ඉලක්කම්] සිට වමේ සිට [අවම වශයෙන් සැලකිය යුතු ඉලක්කම්] දක්වා ලියා ඇත.
Random832

5
එසේනම් බයිට් එකක බිටු “බිග් එන්ඩියන්” ආකෘතියෙන් ගබඩා කරන්නේ ඇයි? අනුකූල නොවන්නේ ඇයි?
tskuzzy

11
ඒවා නොවේ - බිට් 0 යනු සම්මුතියෙන් අවම වැදගත්කමක් වන අතර බිට් 7 වඩාත්ම වැදගත් වේ. එපමණක් නොව, බිටු තනි තනිව ආමන්ත්‍රණය කළ නොහැකි බැවින් ඔබට සාමාන්‍යයෙන් බිටු තුළ ඇණවුම් කළ නොහැක. ඇත්ත වශයෙන්ම, ඔවුන්ට දී ඇති සන්නිවේදන ප්‍රොටෝකෝලයක හෝ ගබඩා මාධ්‍යයක භෞතික අනුපිළිවෙලක් තිබිය හැකිය, නමුත් ඔබ පහත් මට්ටමේ ප්‍රොටෝකෝලය හෝ දෘඩාංග මට්ටමින් වැඩ නොකරන්නේ නම්, මෙම ඇණවුම ගැන ඔබ සැලකිලිමත් විය යුතු නැත.
ස්ටුවර්ට්

3
බ්ලූරාජා: කඩදාසි මත ලිවීමේ සම්මුතියෙන් පමණි. මෙය CPU ගෘහ නිර්මාණ ශිල්පයට පොදු දෙයක් නොවේ. ඔබට 7-0 MSB-LSB වෙනුවට 0-7 LSB-MSB ලෙස බයිට් ලිවිය හැකි අතර ඇල්ගොරිතම දෘෂ්ටි කෝණයෙන් කිසිවක් වෙනස් නොවේ.
එස්.එෆ්.

2
@SF.: "කෙටියෙන් තල්ලු කරන්න, ඕනෑම දෙයක් කෙටි කරන්න " නමුත් ඔබට කෙසේ හෝ පුදුමයක් වනු ඇත. ඔබ කවදාවත් නොපැමිණෙන බයිට් තල්ලු කිරීමෙන් තොගය දූෂිත නොවූවත් ... x86 (32-බිට්), උදාහරණයක් ලෙස, ඇත්ත වශයෙන්ම සැබවින්ම අවශ්‍ය වන්නේ තොගය ද්වි-පෙළගැස්වීම හා හේතු වන ඕනෑම දෙයක් තල්ලු කිරීම හෝ තල්ලු කිරීම ය. 4 හි ගුණකයක් නොවීම ස්ටැක් පොයින්ටරය පෙළගැස්වීමේ ගැටළු ඇති කළ හැකිය. එය එසේ නොවුනත්, දේවල් එකවර මුළු වචනය / dword / qword / යනාදිය තල්ලු කරයි - එබැවින් අඩු බයිට් එක ඔබ පොප් කරන විට ඔබට ලැබෙන පළමු වචනය වනු ඇත.
cHao

44

හරි, මෙන්න මට එය පැහැදිලි කළ පරිදි හේතුව: එකතු කිරීම හා අඩු කිරීම

ඔබ බහු-බයිට් අංක එකතු කරන විට හෝ අඩු කරන විට, ඔබ අවම වශයෙන් සැලකිය යුතු බයිට් වලින් ආරම්භ කළ යුතුය. උදාහරණයක් ලෙස ඔබ බිට් 16 අංක දෙකක් එකතු කරන්නේ නම්, අවම වශයෙන් සැලකිය යුතු බයිට් සිට වඩාත්ම වැදගත් බයිට් වෙත රැගෙන යා හැකිය, එබැවින් රැගෙන යාමක් තිබේදැයි බැලීමට ඔබට අවම වශයෙන් වැදගත් බයිට් වලින් ආරම්භ කළ යුතුය. දිගුකාලීන එකතු කිරීමක් සිදු කරන විට ඔබ නිවැරදි ඉලක්කම් සමඟ ආරම්භ කිරීමට එකම හේතුව මෙයයි. ඔබට වමේ සිට ආරම්භ කළ නොහැක.

මතකයෙන් අනුපිළිවෙලින් බයිට් ලබා ගන්නා 8-බිට් පද්ධතියක් සලකා බලන්න. පළමුවෙන්ම අඩුම වැදගත් බයිට් එකක් ලබා ගන්නේ නම් , එය එකතු කිරීම ආරම්භ කළ හැකි අතර වඩාත්ම වැදගත් බයිට් මතකයෙන් ලබා ගනී. මෙම සමාන්තරකරණය නිසා පද්ධතිය වැනි කුඩා එන්ඩියන් වල කාර්ය සාධනය වඩා හොඳ වන්නේ එබැවිනි. බයිට් දෙකම මතකයෙන් ලබා ගන්නා තෙක් බලා සිටීමට හෝ ප්‍රතිලෝම අනුපිළිවෙලට ඒවා ලබා ගැනීමට සිදුවුවහොත් එය වැඩි කාලයක් ගතවනු ඇත.

මෙය පැරණි 8-බිට් පද්ධති මත වේ. නවීන CPU එකක බයිට් අනුපිළිවෙලෙහි යම් වෙනසක් සිදු වන බවට මට සැකයක් ඇති අතර අපි එන්ඩියන් භාවිතා කරන්නේ historical තිහාසික හේතූන් සඳහා පමණි.


3
අහ් - ඉතින් දළ වශයෙන් එකම හේතුව මම විශාල සංඛ්‍යා සඳහා කුඩා එන්ඩියන් කුට්ටි ඇණවුම් භාවිතා කිරීමයි. මට ඒක කරන්න තිබුණා. මිනිසුන්ට දැන් සයිබර්නෙටික් විද්‍යාව පිළිබඳ වැඩ කිරීමට අවශ්‍යයි - මගේ මොළයට දැනටමත් ආදේශන කොටස් සහ රැඩිකල් වැඩිදියුණු කිරීම් අවශ්‍ය වී ඇත, මට සදහටම බලා සිටිය නොහැක!
ස්ටීව් 314

2
සිතුවිල්ලක් - 6502 දෘඩාංගවල බිටු 16 ගණිතය වැඩි ප්‍රමාණයක් කර නැත - එය සියල්ලටම පසු බිට් 8 ප්‍රොසෙසරයකි. නමුත් එය කළ 16-bit පදනම ලිපිනය සාපේක්ෂව 8-bit අත්සන් හෙළිවෙයි භාවිතා අමතමින් සාපේක්ෂ කරන්න.
ස්ටීව් 314

2
මෙම අදහස තවමත් බහුවිධ නිරවද්‍ය සංඛ්‍යා සංඛ්‍යා ගණිතයට (ස්ටීව් 314 පැවසූ පරිදි) වැදගත් වන නමුත් වචන මට්ටමින් වැදගත් බව සලකන්න. දැන්, බොහෝ මෙහෙයුම් වලට ප්‍රොසෙසරයේ එන්ඩියන භාවය කෙලින්ම බලපාන්නේ නැත: ජීඑම්පී විසින් සිදු කරන පරිදි අවම වශයෙන් වැදගත් වචනය විශාල-එන්ඩියන් පද්ධතියක ගබඩා කළ හැකිය. කුඩා එන්ඩියන් ප්‍රොසෙසරයකට තවමත් මෙහෙයුම් කිහිපයක් සඳහා වාසියක් ඇත (උදා: සමහර සංගීත පරිවර්තන?) වරකට එක බයිට් එකක් කියවීමෙන් පහසු කළ හැකිය, මන්ද කුඩා එන්ඩියන් පද්ධතියක පමණක් එවැනි සංඛ්‍යා වල බයිට් අනුපිළිවෙල නිවැරදි ය.
vinc17

මතක කලාප පළල සීමිත නම් කුඩා-එන්ඩියන් ප්‍රොසෙසරයකට වාසියක් ඇත, සමහර බිටු 32 ARM ප්‍රොසෙසර 16-බිට් මතක බස් රථයක් හෝ 8088 බිටු 8 දත්ත බස් එකක් ඇත: ප්‍රොසෙසරයට අඩු භාගය පටවා කළ හැකිය add / sub / mul ... ඉහළ භාගය එනතුරු බලා සිටින අතරතුර
phuclv

හොඳයි, ඔබට ඉහළම ලිපිනයේ සිට පහළම අගය කියවිය හැකිය.
සයිමන් රිච්ටර්

13

බිට් ප්‍රොසෙසර 8 ක් සමඟ එය නිසැකවම වඩා කාර්යක්ෂම වූ අතර, ඔබට විවිධ කේත අවශ්‍ය නොවී සහ අමතර අගයන් ආරක්ෂා කිරීමට අවශ්‍ය නොවී 8 හෝ 16bit මෙහෙයුමක් කළ හැකිය.

ඔබ වරකට බයිට් එකක් ගනුදෙනු කරන්නේ නම් සමහර එකතු කිරීමේ මෙහෙයුම් සඳහා එය තවමත් හොඳය.

බිග්-එන්ඩියන් වඩාත් ස්වාභාවික බවට කිසිදු හේතුවක් නැත - ඉංග්‍රීසියෙන් ඔබ දහතුනක් (කුඩා එන්ඩියන්) සහ විසිතුනක් (ලොකු එන්ඩියන්) භාවිතා කරයි


1
බිග්-එන්ඩියන් ඇත්ත වශයෙන්ම මිනිසුන්ට පහසු වන්නේ එයට බයිට් නැවත සකස් කිරීම අවශ්‍ය නොවන බැවිනි. උදාහරණයක් ලෙස, PC එකක 0x12345678ගබඩා කර 78 56 34 12ඇති අතර එය BE පද්ධතියක් මත ගබඩා කර ඇත 12 34 56 78(බයිට් 0 වම් පසින්, බයිට් 3 දකුණේ). සංඛ්‍යාව කොතරම් විශාලද යන්න සැලකිල්ලට ගන්න (බිටු අනුව), වැඩි හුවමාරුවක් අවශ්‍ය වේ; වචනයකට එක් හුවමාරුවක් අවශ්‍ය වේ; DWORD, පාස් දෙකක් (මුළු හුවමාරු තුනක්); QWORD පාස් තුනක් (මුළු 7 ක්), සහ එසේ ය. එනම්, (bits/8)-1හුවමාරුව. තවත් විකල්පයක් නම් ඒවා ඉදිරියට සහ පසුපසට කියවීමයි (එක් එක් බයිට් ඉදිරියට කියවීම, නමුත් මුළු # පසුපසට පරිලෝකනය කිරීම).
සයිනෙටෙක්

එකසිය දහතුනක් එක්කෝ මැද-එන්ඩියන් වේ, නැතහොත් “දහතුන” සහිත විශාල එන්ඩියන් යනු දශම නොවන ඉලක්කම් වේ. අපි සංඛ්‍යා අක්ෂර වින්‍යාසය කරන විට, අපි සංඛ්‍යා සඳහා භාවිතා කරන නියත-පාදක සම්මුතීන්ගෙන් සුළු අපගමනයන් ඇත, නමුත් ඔබ එම විශේෂ අවස්ථා ඉවත් කළ පසු ඉතිරිය විශාල-එන්ඩියන් වේ - මිලියන දහස් ගණනකට පෙර, සිය දහස් ගණනකට පෙර දහස් ගණනක්
ස්ටීව් 314

2
@ ස්ටීව් 314, සංඛ්‍යා වල අක්ෂර වින්‍යාසය වැදගත් නොවේ, එය සංඛ්‍යාත්මක කියවීමයි, එය අප වැඩසටහන් කරන විට භාවිතා කරන්නේ එයයි. මාටින්, කිසිම පරිගණකයකට මිනිසුන් සංඛ්‍යා කියවන ආකාරය ගැන සැලකිලිමත් විය යුතු නැත, නමුත් මිනිසුන්ට ඒවා කියවීම පහසු නම්, ක්‍රමලේඛනය (හෝ වෙනත් ආශ්‍රිත වැඩ) පහසු වන අතර සමහර අඩුපාඩු හා දෝෂ අවම කර ගත හැකිය.
සයිනෙටෙක්

1
@ steve314 ඩෙන්මාර්ක භාෂාවෙන් "95" යන්න උච්චාරණය කරනු ලබන්නේ "ස්ත්‍රී හල්ව්ෆෙම්ස්" (පහක් සහ විසි හතරහමාරක්).
Vatine

1
Yn සයිනෙටෙක්: 0x12345678ගබඩා කර 87 65 43 21ඇත්තේ යමෙකු එය ලිවීමට තෝරා ගන්නා ආකාරය අනුව ය. යමෙකු අත්තනෝමතික ලෙස යමක් ලියන ආකාරය (කියවන්න: සන්දර්භය මත රඳා පවතී).
තෝමස් එඩින්

7

ජපන් දින සමුළුව "බිග් එන්ඩියන්" - yyyy / mm / dd. ඇල්ගොරිතම වර්ග කිරීම සඳහා මෙය පහසුය, එමඟින් සරල නූල් භාවිතා කළ හැකිය - සුපුරුදු පළමු අක්‍ෂරය සමඟ සැසඳීම-වඩාත්ම වැදගත් රීතිය.

වඩාත්ම වැදගත්-ක්ෂේත්‍ර-පළමු වාර්තාවක ගබඩා කර ඇති විශාල-එන්ඩියන් අංක සඳහා සමාන දෙයක් අදාළ වේ. ක්ෂේත්‍ර තුළ ඇති බයිට් වල වැදගත් අනුපිළිවෙල, වාර්තාව තුළ ඇති ක්ෂේත්‍රවල වැදගත්කමට ගැලපේ, එබැවින් ඔබට memcmpවාර්තා සංසන්දනය කිරීමට භාවිතා කළ හැකිය, ඔබ දිගු වචන දෙකක්, වචන හතරක් හෝ වෙනම බයිට් අටක් සංසන්දනය කරන්නේද යන්න ගැන එතරම් තැකීමක් නොකරයි.

ක්ෂේත්රවල වැදගත්කමේ අනුපිළිවෙල පෙරළන්න, ඔබට එකම වාසියක් ලැබෙනු ඇත, නමුත් විශාල-එන්ඩියන් වලට වඩා කුඩා-එන්ඩියන් සංඛ්යා සඳහා.

ඇත්ත වශයෙන්ම මෙය ප්‍රායෝගික වැදගත්කමක් නැති තරම්ය. ඔබේ වේදිකාව විශාල-එන්ඩියන් හෝ කුඩා-එන්ඩියන් වේවා, ඔබට ඇත්ත වශයෙන්ම අවශ්‍ය නම් මෙම උපක්‍රමය සූරාකෑමට වාර්තා ක්ෂේත්‍රයක් ඇණවුම් කළ හැකිය. ඔබට අතේ ගෙන යා හැකි කේතයක් ලිවීමට අවශ්‍ය නම් එය වේදනාවක් පමණි .

මම සම්භාව්‍ය අභියාචනයට සබැඳියක් ද ඇතුළත් කළ හැකිය ...

http://tools.ietf.org/rfcmarkup?url=ftp://ftp.rfc-editor.org/in-notes/ien/ien137.txt

සංස්කරණය කරන්න

අමතර සිතුවිල්ලක්. මම වරක් විශාල සංඛ්‍යා පුස්තකාලයක් ලියා (මට හැකි දැයි බැලීමට), ඒ සඳහා, බිටු 32 ක් පළල කුට්ටි කුඩා-එන්ඩියන් අනුපිළිවෙලෙහි ගබඩා කර ඇත, වේදිකාව එම කුට්ටි වල බිටු ඇණවුම් කරන්නේ කෙසේද යන්න නොසලකා. හේතු ...

  1. බොහෝ ඇල්ගොරිතම ස්වාභාවිකවම අවම වශයෙන් සැලකිය යුතු අවසානයකින් වැඩ කිරීමට පටන් ගන්නා අතර එම අන්තයන් ගැලපීමට අවශ්‍ය වේ. උදාහරණයක් ලෙස ඊට අමතරව, වැඩි වැඩියෙන් වැදගත් ඉලක්කම් වෙත ප්‍රක්ෂේපණය කරයි, එබැවින් අවම වශයෙන් සැලකිය යුතු අවසානයකින් ආරම්භ කිරීම අර්ථවත් කරයි.

  2. වටිනාකමක් වැඩීම හෝ හැකිලීම යන්නෙන් අදහස් කරන්නේ අවසානයේ කුට්ටි එකතු කිරීම / ඉවත් කිරීමයි - කුට්ටි ඉහළට / පහළට මාරු කිරීම අවශ්‍ය නොවේ. මතක නැවත ස්ථානගත කිරීම හේතුවෙන් පිටපත් කිරීම තවමත් අවශ්‍ය විය හැකි නමුත් බොහෝ විට එසේ නොවේ.

මෙය සකසනයන්ට පැහැදිලිව අදාළ නොවේ, ඇත්ත වශයෙන්ම - දෘඩාංග විශාල-පූර්ණ සංඛ්‍යා ආධාරයෙන් CPU නිපදවන තුරු, එය තනිකරම පුස්තකාල දෙයක්.


7

මෙය සිදු කළ හැක්කේ මන්දැයි වෙන කිසිවෙකු පිළිතුරු දී නැත, ප්‍රතිවිපාක පිළිබඳ බොහෝ දේ.

දී ඇති ඔරලෝසු චක්‍රයක් තුළ මතකයෙන් තනි බයිට් එකක් පැටවිය හැකි බිට් 8 ප්‍රොසෙසරයක් සලකා බලන්න.

දැන්, ඔබට බිට් 16 ක අගයක් පැටවීමට අවශ්‍ය නම්, ඔබ සතුව ඇති එකම සහ එකම බිට් 16 ලේඛනයට (එනම්) - එනම් ක්‍රමලේඛ කවුන්ටරය, එය කිරීමට සරල ක්‍රමයක් නම්:

  • ලබා ගත් ස්ථානයෙන් බයිට් එකක් පටවන්න
  • එම බයිට් එක වමට ස්ථාන 8 ට මාරු කරන්න
  • වර්ධක මතකය ස්ථානය 1 කින් ලබා ගනී
  • ඊළඟ බයිටය පටවන්න (ලේඛනයේ පහත් පෙළට)

ප්‍රති come ලය: ඔබ කවදා හෝ ලබා ගැනීමේ ස්ථානය වැඩි කරන්නේ නම්, ඔබ කවදා හෝ පටවා ඇත්තේ ඔබගේ අඩු ලේඛනයේ පුළුල් ලේඛනයේ පමණි, ඔබට අවශ්‍ය වන්නේ වමට මාරුවීමට පමණි. (ඇත්ත වශයෙන්ම, දකුණට මාරුවීම වෙනත් මෙහෙයුම් සඳහා උපකාරී වේ, එබැවින් මෙය පැත්තක දර්ශනයකි.)

මෙහි ප්‍රති consequ ලයක් ලෙස බිට් 16 (ද්විත්ව බයිට්) දේවල් බොහෝ පිළිවෙලට ගබඩා කර ඇත. එනම්, කුඩා ලිපිනයට වඩාත්ම වැදගත් බයිට් ඇත - එතරම් විශාල එන්ඩියන්.

ඔබ ඒ වෙනුවට කුඩා එන්ඩියන් භාවිතයෙන් පැටවීමට උත්සාහ කළේ නම්, ඔබට ඔබේ පුළුල් ලේඛනයේ පහළ කොටසට බයිට් එකක් පැටවීමට අවශ්‍ය වනු ඇත, ඉන්පසු ඊළඟ බයිටය වේදිකාගත වන ප්‍රදේශයකට පටවා එය මාරු කර ඔබේ පුළුල් ලේඛනයේ ඉහළට පොප් කරන්න. . නැතහොත් ඉහළ හෝ පහළ බයිට් වලට තෝරා බේරා ගැනීමට හැකි වන පරිදි වඩාත් සංකීර්ණ ගේට්ටු සැකැස්මක් භාවිතා කරන්න.

කුඩා එන්ඩියන් වෙත යාමට උත්සාහ කිරීමේ ප්‍රති result ලය නම් ඔබට තවත් සිලිකන් (ස්විච සහ ගේට්ටු) හෝ තවත් මෙහෙයුම් අවශ්‍ය වේ.

වෙනත් වචන වලින් කිවහොත්, පැරණි දිනවල නැවත මුදල් ලබා ගැනීම සම්බන්ධයෙන් ගත් කල, ඔබට බොහෝ කාර්ය සාධනය සහ කුඩාම සිලිකන් ප්‍රදේශය සඳහා වැඩි වේගයක් ලැබුණි.

මෙම දින තුළ, මෙම සලකා බැලීම් හා එච්චරමයි අනදාල, නමුත් නල තෘප්තියට වැනි දේවල් විය හැක තවමත් ලොකු ගනුදෙනුවක් ටිකක් විය.

S / w ලිවීමේදී, කුඩා එන්ඩියන් ලිපින භාවිතා කරන විට ජීවිතය නිතරම පහසු වේ.

(ඒ මහා endian සකසන බිටු-in-බයිට් අනුව බයිට ඇනවුම් සහ කුඩා endian අනුව විශාල endian විය හැක. නමුත් සමහර දත්ත සැකසුම් ඒකක අමුතු හා බයිට ඇනවුම් කිරීම මෙන්ම විශාල endian ටිකක් ඇනවුම් කිරීම භාවිතා කරනු ඇත. මෙම ජීවිතය කරයි ඉතා මතක සිතියම්ගත කරන ලද පර්යන්ත එකතු කරන h / w නිර්මාණකරුට සිත්ගන්නාසුළු නමුත් එය ක්‍රමලේඛකයාට වෙනත් ප්‍රති ence ලයක් නොවේ.)


3

ජිම්වයිස් හොඳ අදහසක් ඉදිරිපත් කළේය. තවත් ගැටලුවක් තිබේ, කුඩා එන්ඩියන් භාෂාවෙන් ඔබට පහත සඳහන් දෑ කළ හැකිය:

byte data[4];
int num=0;
for(i=0;i<4;i++)
    num += data[i]<<i*8; 

OR 

num = *(int*)&data; //is interpreted as

mov dword data, num ;or something similar it has been some time

මතකයේ හුවමාරු වූ ස්ථානවල පැහැදිලිවම අවාසි වලින් බලපෑමට ලක් නොවන ක්‍රමලේඛකයින් සඳහා වඩාත් forward ජුව ඉදිරියට. මම පෞද්ගලිකව ලොකු එන්ඩියන් ස්වාභාවික දේට ප්‍රතිලෝමව සිටින බව සොයා ගතිමි :). 12 ගබඩා කර 21 ලෙස ලිවිය යුතුය :)


1
CPU වලට ආවේණික වූ ඕනෑම ආකෘතියකින් වැඩ කිරීම වේගවත් / පහසු බව මෙයින් සනාථ වේ. එය වඩා හොඳද යන්න ගැන එය කිසිවක් නොකියයි. විශාල එන්ඩියන් සඳහා එකම දේ වේ: විශාල එන්ඩියන් CPU එකකට for(i=0; i<4; i++) { num += data[i] << (24 - i * 8); }අනුරූප වේ move.l data, num.
මාටින් විල්කන්ස්

art මාර්ටින්: මගේ පොතේ අඩු අඩු කිරීමක් වඩා හොඳය
Cem Kalyoncu

සම්පාදකයා කෙසේ හෝ ලූපය මුදා හරිනු ඇති බැවින් එය ඇත්ත වශයෙන්ම වැදගත් නොවේ. කෙසේ වෙතත්, බොහෝ CPU වල මෙම ගැටළුව විසඳීම සඳහා බයිට් හුවමාරු උපදෙස් තිබේ.
මාටින් විල්කන්ස්

මම විශාල එන්ඩියන් මත bcoz එකඟ නොවෙමි, මම කරන්නෙමි {num << = 8; num | = දත්ත [i]; least අවම වශයෙන් මේ සඳහා වම්පස මාරුව ගණනය කිරීම අවශ්‍ය නොවේ mul
Hayri Uğur Koltuk

@ali: ඔබේ කේතය මා ලියූ නිශ්චිත මෙහෙයුම සිදු කරන අතර විශාල එන්ඩියන් මත ක්‍රියා නොකරනු ඇත.
Cem Kalyoncu

1

යමෙකුට බයිට් ප්‍රතිලෝම අනුපිළිවෙලට ගබඩා කිරීමට අවශ්‍ය වන්නේ මන්දැයි මම නිතරම කල්පනා කරමි

දශම අංකය විශාල එන්ඩියන් ලෙස ලියා ඇත. එය ඔබ ඉංග්‍රීසියෙන් ලියන ආකාරය ද ඔබ ආරම්භ කරන්නේ වඩාත්ම වැදගත් ඉලක්කම් වලින් වන අතර ඊළඟට වඩාත්ම වැදගත් සිට අවම වශයෙන් වැදගත් වේ. උදා

1234

යනු දහසක්, දෙසිය තිස් හතරකි.

විශාල එන්ඩියන් සමහර විට ස්වාභාවික අනුපිළිවෙල ලෙස හැඳින්වේ.

කුඩා එන්ඩියන් භාෂාවෙන් මෙම සංඛ්‍යාව එක, විසි, තුන්සිය හාරදහසක් වනු ඇත.

කෙසේ වෙතත්, ඔබ එකතු කිරීම හෝ අඩු කිරීම වැනි අංක ගණිතය සිදු කරන විට, ඔබ අවසානය සමඟ ආරම්භ කරයි.

  1234
+ 0567
  ====

ඔබ 4 සහ 7 සමඟ ආරම්භ කර, අවම ඉලක්කම් ලියන්න සහ රැගෙන යාම මතක තබා ගන්න. ඉන්පසු ඔබ 3 සහ 6 යනාදිය එකතු කරයි. එකතු කිරීම, අඩු කිරීම හෝ සංසන්දනය කිරීම සඳහා, මතකය පිළිවෙලට කියවීමට ඔබට දැනටමත් තර්කනයක් තිබේ නම්, සංඛ්‍යා ආපසු හරවනු ලැබේ නම් එය ක්‍රියාත්මක කිරීම පහසුය.

මේ ආකාරයට විශාල එන්ඩියන් සඳහා සහය දැක්වීමට, ඔබට මතකය ප්‍රතිලෝමව කියවීමට තර්කනය අවශ්‍ය වේ, නැතහොත් ඔබට RISC ක්‍රියාවලියක් ඇති අතර එය ක්‍රියාත්මක වන්නේ රෙජිස්ටරවල පමණි. ;)

Intel x86 / Amd x64 නිර්මාණය ගොඩක් is තිහාසිකයි.


0

බිග්-එන්ඩියන් සමහර මෙහෙයුම් සඳහා ප්‍රයෝජනවත් වේ (මතකයට සමාන අෂ්ටක දිග උල්පත් වල "බිග්නම්" සංසන්දනය). අනෙක් අයට කුඩා-එන්ඩියන් (සමහර විට "බිග්නම්" දෙකක් එකතු කිරීම). අවසානයේදී, එය රඳා පවතින්නේ CPU දෘඩාංග සඳහා සකසා ඇති දේ මතය, එය සාමාන්‍යයෙන් එකක් හෝ වෙනත් ය (සමහර MIPS චිප්ස්, IIRC, ඇරඹුම් මත මාරු කළ හැකි LE හෝ BE විය).


0

විචල්ය දිග සමඟ ගබඩා කිරීම හා මාරු කිරීම පමණක් සිදු වන නමුත් බහු අගයන් සහිත අංක ගණිතයක් නොමැති විට LE සාමාන්‍යයෙන් ලිවීමට පහසු වන අතර BE කියවීමට පහසු වේ.

නිශ්චිත උදාහරණයක් ලෙස අපි අන්තර්-නූල් පරිවර්තනයක් (සහ පසුපසට) ගනිමු.

int val_int = 841;
char val_str[] = "841";

Int එක නූල් බවට පරිවර්තනය කළ විට, වඩාත්ම වැදගත් ඉලක්කම් වලට වඩා අවම සැලකිය යුතු ඉලක්කම් නිස්සාරණය කිරීම පහසුය. ඒ සියල්ල සරල අන්ත තත්වයකින් සරල ලූපයකින් කළ හැකිය.

val_int = 841;
// Make sure that val_str is large enough.

i = 0;
do // Write at least one digit to care for val_int == 0
{
    // Constants, can be optimized by compiler.
    val_str[i] = '0' + val_int % 10;
    val_int /= 10;
    i++;
}
while (val_int != 0);

val_str[i] = '\0';
// val_str is now in LE "148"
// i is the length of the result without termination, can be used to reverse it

දැන් BE අනුපිළිවෙලින් එයම උත්සාහ කරන්න. සාමාන්‍යයෙන් ඔබට නිශ්චිත සංඛ්‍යාවක් සඳහා විශාලතම බලය 10 ක් ඇති තවත් බෙදුම්කරුවෙකු අවශ්‍ය වේ (මෙහි 100). ඔබ මුලින්ම මෙය සොයා ගත යුතුයි. තවත් බොහෝ දේ කිරීමට තිබේ.

ප්‍රතිලෝම ලිවීමේ මෙහෙයුම ලෙස එය සිදු කළ විට, ඉන්ට් පරිවර්තනයේ නූල BE හි කිරීමට පහසුය. වඩාත්ම වැදගත් ඉලක්කම් අන්තිමට ලියන්න, එබැවින් එය පළමුව කියවිය යුතුය.

val_int = 0;
length = strlen(val_str);

for (i = 0; i < length; i++)
{
    // Again a simple constant that can be optimized.
    val_int = 10*val_int + (val_str[i] - '0');
}

දැන් LE අනුපිළිවෙලින් එය කරන්න. නැවතත්, ඔබට 1 න් ආරම්භ වන අතිරේක සාධකයක් අවශ්‍ය වන අතර එක් එක් ඉලක්කම් සඳහා 10 කින් ගුණ කළ යුතුය.

මේ අනුව මම සාමාන්‍යයෙන් ගබඩා කිරීම සඳහා BE භාවිතා කිරීමට කැමැත්තෙමි, මන්ද අගයක් හරියටම එක් වරක් ලියා ඇති නමුත් අවම වශයෙන් එක් වරක් හෝ බොහෝ විට කියවන්න. එහි සරල ව්‍යුහය සඳහා, මම සාමාන්‍යයෙන් LE වෙත පරිවර්තනය වීමටත්, ප්‍රති second ලය ආපසු හැරවීමටත්, එය දෙවන වරටත් අගය ලිවුවද.

BE ගබඩා කිරීම සඳහා තවත් උදාහරණයක් වනුයේ UTF-8 කේතන ක්‍රමය සහ තවත් බොහෝ දේ ය.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.