কেন 11010100 << 1 সমান 110101000, 10101000 নয়?


40

আমি যখন 11010100 2 এর জন্য বিট স্থানান্তর করার চেষ্টা করি তখন ফলাফলটি 10101000 2 নয়, 110101000 2 হয়

int a = Integer.parseInt("11010100", 2) << 1;

আমি এটি করার চেষ্টা করি:

int a = (byte)(Integer.parseInt("11010100", 2) << 1);

তবে যদি আউটপুট মান 128 এর বেশি হয় তবে সবকিছু বিয়োগে চলে যায় যা যৌক্তিক। আমি কীভাবে এই সংখ্যাটি পরিবর্তন করতে পারি না?


4
পূর্ণসংখ্যার গাণিতিকটি সর্বদা intএস বা longএস- তে করা হয় ।
টম হাটিন -

34
আপনি পূর্ণসংখ্যার ব্যবহার করছেন, সেগুলি 32 বিট দীর্ঘ। আপনি ফলাফলটি 8 টি বিট করে কাটানোর আশা করবেন কেন?
jhaman

1
বাইট এ = ... এটি ঠিক করবে।
পেরডি এস্তাকুয়েল

উত্তর:


61

আসুন একবারে এটির একধাপ।

  1. Integer.parseInt("11010100", 2)- এটি হ'ল মান 212 This এটি উপায় দ্বারা, অযথা; আপনি শুধু লিখতে পারেন: 0b11010100

  2. 0b11010100 << 1হিসাবে একই 0b110101000, এবং 424 হয়।

  3. এর পরে আপনি একটি বাইট সামনে ছুঁড়ে: (byte)(0b11010100 << 1)। প্রথম 8 এর বাইরে বিটগুলি সমস্ত লপ্পড হয়ে যায়, যা 0b10101000 ছেড়ে যায়, যা -88। বিয়োগ, হ্যাঁ, কারণ জাভা বাইটে স্বাক্ষরিত।

  4. আপনি যখন নিখরচায় এটি -88 ব্যাক আপ হিসাবে পূর্বাবস্থায় ফিরে যান, আপনি এটি কোনও ইনট মান হিসাবে নির্ধারিত করেন। এটি রয়ে গেছে -৮৮, যার অর্থ শীর্ষস্থানীয় সমস্ত বিটগুলি সমস্ত 1s।

অতএব, চূড়ান্ত মান হয় -88

আপনি যদি 168পরিবর্তে দেখতে চান (যা হুবহু একই বিট, তবে স্বাক্ষরের পরিবর্তে স্বাক্ষরযুক্ত দেখানো হয়েছে), সাধারণ কৌশলটি হ'ল & 0xFFপ্রথম 8 থেকে 0 বাদে সমস্ত বিট সেট করে, সুতরাং ইতিবাচক সংখ্যার গ্যারান্টি দেয়:

byte b = (byte) (0b11010100 << 1);
System.out.println(b); // -88. It is not possible to print 168 when printing a byte.
int asUnsigned = b & 0xFF;
System.out.println(asUnsigned); // 168.

// or in one go:

System.out.println(((byte) (0b11010100 << 1)) & 0xFF); // 168

19
তিনি মানটি সঞ্চিত করছেন int a, সুতরাং যদি আপনার কাছে থাকে & 0xFFতবে আপনার কিছু দেওয়ার দরকার নেই। int a = (0b11010100<< 1) & 0xFF;
মাকিং হাঁস

9

আপনি যদি নীচে 8 টি বিটের চেয়ে বেশি সমস্ত বিট সেট করতে চান তবে আপনি বিট-ওয়াইজ ব্যবহার করতে পারেন এবং:

int a = (Integer.parseInt("11010100", 2) << 1) & 0xff;
System.out.println (Integer.toString(a,2));

আউটপুট:

10101000

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