উত্তর:
জাভাতে, একটি int32 বিট হয়। ক byte8 হয় bits।
জাভা সর্বাধিক আদিম ধরনের সাইন ইন করেছেন, এবং byte, short, int, এবং longদুই এর সম্পূরক এনকোড করা হয়। ( charপ্রকারটি স্বাক্ষরযুক্ত, এবং একটি চিহ্নের ধারণা প্রযোজ্য নয় boolean))
এই সংখ্যা স্কিমে সবচেয়ে উল্লেখযোগ্য বিট সংখ্যার সাইন নির্দিষ্ট করে। যদি আরও বিটগুলির প্রয়োজন হয় তবে সর্বাধিক উল্লেখযোগ্য বিট ("এমএসবি") কেবল নতুন এমএসবিতে অনুলিপি করা হয়।
সুতরাং আপনার যদি বাইট রয়েছে 255: 11111111
এবং আপনি এটিকে উপস্থাপন করতে চান int(32 বিট) আপনি কেবল বামে 1 টি 24 বার অনুলিপি করতে পারেন।
এখন, নেতিবাচক দুইটির পরিপূরক সংখ্যাটি পড়ার একটি উপায় হ'ল কমপক্ষে উল্লেখযোগ্য বিট দিয়ে শুরু করা, আপনি প্রথম 1টি না পাওয়া পর্যন্ত বাম দিকে সরে যান, তারপরে প্রতিটি বিট উল্টিয়ে দিন। ফলাফলটি হ'ল সেই সংখ্যার ইতিবাচক সংস্করণ
উদাহরণস্বরূপ: = এ 11111111যায় । এটি জাভা মান হিসাবে প্রদর্শিত হবে।00000001-1
আপনি সম্ভবত যা করতে চান তা হ'ল বাইটের স্বাক্ষরযুক্ত মানটি।
আপনি বিটমাস্ক দিয়ে এটি সম্পাদন করতে পারেন যা সর্বনিম্ন উল্লেখযোগ্য 8 বিট বাদ দিয়ে সবকিছু মুছে দেয়। (0xff)
তাই:
byte signedByte = -1;
int unsignedByte = signedByte & (0xff);
System.out.println("Signed: " + signedByte + " Unsigned: " + unsignedByte);
মুদ্রণ করবে: "Signed: -1 Unsigned: 255"
আসলে এখানে কি ঘটছে?
আমরা বিটওয়্যারটি ব্যবহার করছি এবং সমস্ত বহিরাগত চিহ্নের বিটগুলি মাস্ক করতে (কমপক্ষে উল্লেখযোগ্য 8 টি বিটের 1 এর বাম দিকে।) যখন কোনও int বাইটে রূপান্তরিত হয়, জাভা বাম-সর্বাধিক 24 বিটগুলি বন্ধ করে দেয়
1111111111111111111111111010101
&
0000000000000000000000001111111
=
0000000000000000000000001010101
যেহেতু 32 তম বিট এখন 8 তম বিটের পরিবর্তে সাইন বিট (এবং আমরা সাইন বিটটি 0 তে নির্ধারণ করেছি যা ইতিবাচক), বাইট থেকে আসল 8 বিটটি ইতিবাচক মান হিসাবে জাভা দ্বারা পড়া হয়।
signedByte & (0xff)যা হ্যাপেনিং হচ্ছে এটি 0xffএকটি সংখ্যার আক্ষরিক, সুতরাং বিটওয়াইজ অপারেশন সম্পাদনের আগে স্বাক্ষরযুক্ত বাইট একটি পূর্ণসংখ্যায় উন্নীত হয়।
132অঙ্কগুলিতে ( বেস 10 ) 1000_0100বিটগুলিতে হয় ( বেস 2 ) এবং জাভা স্টোর int32 বিটে:
0000_0000_0000_0000_0000_0000_1000_0100
ইন-টু-বাইটের জন্য অ্যালগরিদমটি বাম-কাটা; এর জন্য অ্যালগরিদম System.out.printlnহ'ল দুটি'র পরিপূরক (দুইটির পরিপূরক যদি হয় বাম দিকের কিছুটা হয় তবে ;ণাত্মক কারও পরিপূরক (বিট বিট) বিয়োগ-এক 1হিসাবে ব্যাখ্যা করুন ;); এভাবে :System.out.println(int-to-byte( ))
0000_0000_0000_0000_0000_0000_1000_0100) ()))])1000_0100বিস্মৃত) (] )))1000_0100)))1000_0011)))0111_1100))0ইতিবাচক এবং 1নেতিবাচক জন্য)।
intএকটি থেকে byteএকটি লজি convertion (অর্থাত তথ্য হারিয়ে গেছে)। অতএব, এটিকে আবার মূল intমূল্যে রূপান্তর করার কোনও উপায় নেই ।
জাভাতে বাইটটি স্বাক্ষরিত হয়, সুতরাং এটির পরিসীমা রয়েছে -2 ^ 7 থেকে 2 ^ 7-1 - অর্থাৎ, -128 থেকে 127 13 এটি হ'ল মূলত 256 (2 ^ 8) সীমাবদ্ধ না হওয়া পর্যন্ত যোগ বা বিয়োগ করা হয়।
আরও তথ্যের জন্য, আপনি দু'জনের পরিপূরকটি পড়তে চাইতে পারেন ।
বিভ্রান্তিকর তত্ত্বগুলি ছাড়াই এখানে একটি খুব যান্ত্রিক পদ্ধতি রয়েছে:
এই আরও ব্যবহারিক পদ্ধতিটি উপরের তাত্ত্বিক উত্তরের সাথে সামঞ্জস্য। সুতরাং, এখনও যারা জাভা বইগুলি পড়ছেন তারা মডুলো ব্যবহার করতে বলছেন, এটি অবশ্যই ভুল কারণ যেহেতু আমি উপরে বর্ণিত 4 টি পদক্ষেপগুলি অবশ্যই কোনও মডুলো অপারেশন নয়।
http://iiti.ac.in/people/~tanimad/JavaTheCompleteReference.pdfপৃষ্ঠা 59
জাভাতে byte(এন = 8) এবং int(এন = 32) উপরে দেখানো 2 এস-পরিপূরক দ্বারা প্রতিনিধিত্ব করা হয়।
সমীকরণ থেকে, একটি 7 এর পক্ষে নেতিবাচক byteতবে এর জন্য ধনাত্মক int।
coef: a7 a6 a5 a4 a3 a2 a1 a0
Binary: 1 0 0 0 0 1 0 0
----------------------------------------------
int: 128 + 0 + 0 + 0 + 0 + 4 + 0 + 0 = 132
byte: -128 + 0 + 0 + 0 + 0 + 4 + 0 + 0 = -124
প্রায়শই বইগুলিতে আপনি মডিউলাস বিভাগ দ্বারা সম্পাদিত হিসাবে int থেকে বাইটে ingালাইয়ের ব্যাখ্যা পাবেন। এটি যথাযথভাবে সঠিক হয় না যা নীচে প্রদর্শিত হয় যা প্রকৃতপক্ষে ঘটে থাকে তা হল আন্তঃসংখ্যার বাইনারি মান থেকে 24 টি উল্লেখযোগ্য বিটগুলি বিভ্রান্তি ফেলে দেয় যদি বাকী বামদিকের বিট সেট থাকে যা সংখ্যাটিকে negativeণাত্মক হিসাবে চিহ্নিত করে
public class castingsample{
public static void main(String args[]){
int i;
byte y;
i = 1024;
for(i = 1024; i > 0; i-- ){
y = (byte)i;
System.out.print(i + " mod 128 = " + i%128 + " also ");
System.out.println(i + " cast to byte " + " = " + y);
}
}
}
একটি দ্রুত অ্যালগরিদম এটি যেভাবে কাজ করে তা অনুকরণ করে:
public int toByte(int number) {
int tmp = number & 0xff
return (tmp & 0x80) == 0 ? tmp : tmp - 256;
}
কিভাবে এই কাজ? Daixtr উত্তর তাকান । তার উত্তরে ছড়িয়ে দেওয়া ঠিক অ্যালগরিদমের একটি বাস্তবায়ন নিম্নলিখিত:
public static int toByte(int number) {
int tmp = number & 0xff;
if ((tmp & 0x80) == 0x80) {
int bit = 1;
int mask = 0;
for(;;) {
mask |= bit;
if ((tmp & bit) == 0) {
bit <<=1;
continue;
}
int left = tmp & (~mask);
int right = tmp & mask;
left = ~left;
left &= (~mask);
tmp = left | right;
tmp = -(tmp & 0xff);
break;
}
}
return tmp;
}
আপনি যদি এই গাণিতিকভাবে বুঝতে চান তবে এটি কীভাবে কাজ করে like
সুতরাং মূলত b / w -128 থেকে 127 পর্যন্ত সংখ্যাগুলি তাদের দশমিক মান হিসাবে একইভাবে লেখা হবে, এর উপরে (আপনার সংখ্যা - 256)।
যেমন। 132, উত্তরটি হবে 132 - 256 = - 124 অর্থাত্
256 + (-124) নম্বরটিতে আপনার উত্তর 132
আরেকটি উদাহরণ
double a = 295.04;
int b = 300;
byte c = (byte) a;
byte d = (byte) b; System.out.println(c + " " + d);
আউটপুট 39 44 হবে
(295 - 256) (300 - 256)
দ্রষ্টব্য: এটি দশমিকের পরে সংখ্যাগুলি বিবেচনা করবে না।
ধারণা অনুসারে, আপনার সংখ্যাটিতে 256 এর পুনরাবৃত্তি বিয়োগগুলি করা হয়, যতক্ষণ না এটি -128 থেকে +127 এর মধ্যে থাকে। সুতরাং আপনার ক্ষেত্রে, আপনি 132 দিয়ে শুরু করুন, তারপরে এক ধাপে -124 দিয়ে শেষ করুন।
গুণগতভাবে, এটি আপনার আসল নম্বর থেকে 8 সর্বনিম্ন উল্লেখযোগ্য বিট বের করার সাথে মিলে যায়। (এবং দ্রষ্টব্য যে এই 8 এর মধ্যে উল্লেখযোগ্য বিটটি সাইন বিট হয়ে যায়))
নোট করুন যে অন্য ভাষায় এই আচরণটি সংজ্ঞায়িত হয় না (যেমন সি এবং সি ++)।
N is input number
case 1: 0<=N<=127 answer=N;
case 2: 128<=N<=256 answer=N-256
case 3: N>256
temp1=N/256;
temp2=N-temp*256;
if temp2<=127 then answer=temp2;
else if temp2>=128 then answer=temp2-256;
case 4: negative number input
do same procedure.just change the sign of the solution