জাভা যখন ইনটকে বাইটে রূপান্তর করে?


130
int i =132;

byte b =(byte)i; System.out.println(b);

Mindboggling। আউটপুট কেন -124?

উত্তর:


172

জাভাতে, একটি 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 বিটটি ইতিবাচক মান হিসাবে জাভা দ্বারা পড়া হয়।


1
ভাল হয়েছে, এই বিষয়ে সেরা ব্যাখ্যা, ওয়েন! আমি কেবল গণিতের আনুষ্ঠানিকতার সন্ধান করছি কেন দু'জনের পরিপূরক উপস্থাপনায় বিট যুক্ত করার জন্য ডানদিকে সাইন বিটটি অনুলিপি করা যায়। এটি সংখ্যার নেতিবাচক কীভাবে পাওয়া যায় তার নিয়মটি বিবেচনা করে এটি বোঝা সহজ। এটি হ'ল: ডান থেকে বামে সমস্ত বিট বিবেচনা করুন এবং প্রথম 1 টি পর্যন্ত এগুলি অপরিবর্তিত রাখুন। তারপরে পরবর্তী বিটগুলি উল্টে দিন। যদি আমি অনুপস্থিত বিটটিকে 0 এর মান হিসাবে বিবেচনা করি তবে এটি সহজেই বোঝা যায় যে তারা সবাই 1 এ চলেছে But তবে আমি আরও একটি 'গণিত' ব্যাখ্যা খুঁজছিলাম।
এগ্রোস্টিনএক্স

এখানে signedByte & (0xff)যা হ্যাপেনিং হচ্ছে এটি 0xffএকটি সংখ্যার আক্ষরিক, সুতরাং বিটওয়াইজ অপারেশন সম্পাদনের আগে স্বাক্ষরযুক্ত বাইট একটি পূর্ণসংখ্যায় উন্নীত হয়।
কেভিন হুইলার

এটি 0xFF নয়, এটি আপনার উদাহরণে 0x7E!
জনিটেক্স

89

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))
  • = ব্যাখ্যা হিসাবে (নেতিবাচক (124))
  • = ব্যাখ্যা হিসাবে (-124)
  • = -124 তদা !!!

7
খুব সুন্দরভাবে ব্যাখ্যা করা হয়েছে
ZAJ

1
সুতরাং এখন দশমিক 132 বাইট -124 হয়। বিপরীত কাজ করে কীভাবে?
নিলেশ দেওকার

@ নীলেশ দেওকার, বিপরীতটি পোলা দ্বারা রয়েছে যেহেতু তারা ফিট করে (; সিএফ জেএলএস 5.1.2 ); আউটপুট সাইন-বামপ্যাডের সাথে মিলে যায় ( 0ইতিবাচক এবং 1নেতিবাচক জন্য)।
পেসারিয়ার

পোলা কি? থেকে convertion intএকটি থেকে byteএকটি লজি convertion (অর্থাত তথ্য হারিয়ে গেছে)। অতএব, এটিকে আবার মূল intমূল্যে রূপান্তর করার কোনও উপায় নেই ।
ট্রুথহোল্ডার

23

জাভাতে বাইটটি স্বাক্ষরিত হয়, সুতরাং এটির পরিসীমা রয়েছে -2 ^ 7 থেকে 2 ^ 7-1 - অর্থাৎ, -128 থেকে 127 13 এটি হ'ল মূলত 256 (2 ^ 8) সীমাবদ্ধ না হওয়া পর্যন্ত যোগ বা বিয়োগ করা হয়।

আরও তথ্যের জন্য, আপনি দু'জনের পরিপূরকটি পড়তে চাইতে পারেন ।


16

132 একটি বাইটের সীমার বাইরে যা -128 থেকে 127 হয় (বাইট.এম.এক্স.এল.এল.পি. থেকে বাইট.ম্যাক্স_ভালিউ) এর পরিবর্তে 8-বিট মানটির শীর্ষ বিটটিকে স্বাক্ষর হিসাবে বিবেচনা করা হয় যা এটি এই ক্ষেত্রে নেতিবাচক বলে নির্দেশ করে। সুতরাং সংখ্যাটি 132 - 256 = -124।


5

বিভ্রান্তিকর তত্ত্বগুলি ছাড়াই এখানে একটি খুব যান্ত্রিক পদ্ধতি রয়েছে:

  1. সংখ্যাটি বাইনারি উপস্থাপনে রূপান্তর করুন (একটি ক্যালকুলেটর ঠিক আছে?)
  2. কেবলমাত্র 8 টি বিট (এলএসবি) অনুলিপি করুন এবং বাকীটি ফেলে দিন।
  3. পদক্ষেপ # 2 এর ফলাফল থেকে, যদি বামতম বিট 0 হয়, তবে সংখ্যাটি দশমিক হিসাবে রূপান্তর করতে একটি ক্যালকুলেটর ব্যবহার করুন। এটি আপনার উত্তর।
  4. অন্যথায় (যদি বাম দিকের কিছুটা 1 হয়) আপনার উত্তরটি নেতিবাচক। সমস্ত ডানদিকের জিরো এবং প্রথম অ-শূন্য বিট অপরিবর্তিত রেখে দিন। এবং বাকীটি বিপরীত করেছে, এটি হল 1 এর দ্বারা 0 এর দ্বারা এবং 0 এর দ্বারা 1 এর দ্বারা প্রতিস্থাপন করুন। তারপরে দশমিক রূপান্তর করতে একটি ক্যালকুলেটর ব্যবহার করুন এবং মানটি নেতিবাচক বলে চিহ্নিত করতে একটি নেতিবাচক চিহ্ন যুক্ত করুন।

এই আরও ব্যবহারিক পদ্ধতিটি উপরের তাত্ত্বিক উত্তরের সাথে সামঞ্জস্য। সুতরাং, এখনও যারা জাভা বইগুলি পড়ছেন তারা মডুলো ব্যবহার করতে বলছেন, এটি অবশ্যই ভুল কারণ যেহেতু আমি উপরে বর্ণিত 4 টি পদক্ষেপগুলি অবশ্যই কোনও মডুলো অপারেশন নয়।


'মোডুলো' ব্যবহার করতে জাভা বই কী বলছে? আমি কোনও সিএস বই কখনও দেখিনি যে 46 বছরের মধ্যে কোনও জাভা বই ছেড়ে দেয় alone কী 'মডুলো'? জাভাতে কোনও মডুলো অপারেশন নেই। কেবলমাত্র একজন অবশিষ্ট অপারেটর।
লার্নের মারকুইস

গ্রেপ শক্ত। http://iiti.ac.in/people/~tanimad/JavaTheCompleteReference.pdfপৃষ্ঠা 59
ট্রুথহোল্ডার

4

দু'জনের পরিপূরক সমীকরণ:

এখানে চিত্র বর্ণনা লিখুন


জাভাতে 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

2

প্রায়শই বইগুলিতে আপনি মডিউলাস বিভাগ দ্বারা সম্পাদিত হিসাবে 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);

    }

}

}

2
46 বছরে আমি কোনও বইতে কখনও দেখিনি।
লার্নের মারকুইস

2

একটি দ্রুত অ্যালগরিদম এটি যেভাবে কাজ করে তা অনুকরণ করে:

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;
}

1

আপনি যদি এই গাণিতিকভাবে বুঝতে চান তবে এটি কীভাবে কাজ করে 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)

দ্রষ্টব্য: এটি দশমিকের পরে সংখ্যাগুলি বিবেচনা করবে না।


0

ধারণা অনুসারে, আপনার সংখ্যাটিতে 256 এর পুনরাবৃত্তি বিয়োগগুলি করা হয়, যতক্ষণ না এটি -128 থেকে +127 এর মধ্যে থাকে। সুতরাং আপনার ক্ষেত্রে, আপনি 132 দিয়ে শুরু করুন, তারপরে এক ধাপে -124 দিয়ে শেষ করুন।

গুণগতভাবে, এটি আপনার আসল নম্বর থেকে 8 সর্বনিম্ন উল্লেখযোগ্য বিট বের করার সাথে মিলে যায়। (এবং দ্রষ্টব্য যে এই 8 এর মধ্যে উল্লেখযোগ্য বিটটি সাইন বিট হয়ে যায়))

নোট করুন যে অন্য ভাষায় এই আচরণটি সংজ্ঞায়িত হয় না (যেমন সি এবং সি ++)।


পরিষ্কার করা, ফলাফলের আপনি পেতে একই যেন পুনরাবৃত্তি subtractions সম্পন্ন করা হয়। অনুশীলনে, জেভিএম আসলে এটি এভাবে করে না। (এটি মারাত্মকভাবে অক্ষম হবে!)
স্টিফেন সি

প্রকৃতপক্ষে. আমি আশা করি আমার দ্বিতীয় অনুচ্ছেদে জেভিএম আসলে এটি কী করে তা কভার করে। তবে আমি আমার ভাষার সাথে কিছুটা ফিড করেছি।
বাথশেবা

1
হ্যাঁ. "মূলত" পরিবর্তন "ধারণাগতভাবে" একটি বিশাল পার্থক্য তোলে!
স্টিফেন সি

-1
 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           

সঠিক উত্তরটি বিট-মাস্কিং দ্বারা এসেছে, বিভাজন এবং অবশিষ্ট দ্বারা নয়।
লার্নের মারকুইস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.