জাভাতে মান এবং 0xff কি করে?


102

আমার নীচে জাভা কোড রয়েছে:

byte value = 0xfe; // corresponds to -2 (signed) and 254 (unsigned)
int result = value & 0xff;

মুদ্রিত হওয়ার পরে ফলাফলটি 254 হয় তবে এই কোডটি কীভাবে কাজ করে তা আমার কোনও ধারণা নেই। যদি &অপারেটরটি কেবল বিটওয়াইজ হয় তবে কেন এটি বাইট এবং পরিবর্তে পূর্ণসংখ্যার ফলাফল দেয় না?


আমি কোডটি একিপ্সিতে কপি করি। এটি আমাকে সতর্ক করে "টাইপ মেল্যাচ: ইনট থেকে বাইটে রূপান্তর করতে পারে না"। এটি কি int মান = 0xfe এ পরিবর্তন করা উচিত;
বেন চেং

4
@ বেনচেং হওয়া উচিতbyte value = (byte) 0xfe;
বেক

উত্তর:


175

এটি সর্বনিম্ন 8 বিটের result8 বিট স্থাপনের ফলে (স্বাক্ষরযুক্ত) মানটিতে সেট করে ।valueresult

এর মতো কিছু প্রয়োজনীয় হওয়ার কারণ হ'ল এটি byteজাভাতে স্বাক্ষরিত একটি প্রকার। আপনি যদি শুধু লিখেছেন:

int result = value;

তার পরিবর্তে resultমান দিয়ে শেষ হবে । আরও সূক্ষ্মতাটি হ'ল কেবলমাত্র 1 মানগুলিতে পরিচালনা করতে সংজ্ঞা দেওয়া হয়েছে , তাই যা ঘটে তা হ'ল:ff ff ff fe00 00 00 fe&int

  1. valueএকটি int( ff ff ff fe) তে উন্নীত হয় ।
  2. 0xffএকটি intআক্ষরিক ( 00 00 00 ff)।
  3. এর &জন্য পছন্দসই মানটি প্রয়োগ করতে প্রয়োগ করা হয় result

(পয়েন্ট যে রূপান্তর হয় intএরকম আগে& অপারেটর প্রয়োগ করা হয়।)

1 ভাল, বেশ না। &অপারেটর উপর কাজ করে longপাশাপাশি মূল্যবোধ, যদি পারেন প্রতীক একটি নয় long। তবে না byte। জাভা ভাষার নির্দিষ্টকরণ, বিভাগ 15.22.1 এবং 5.6.2 দেখুন


এই চিহ্নটিতে x এর অর্থ কী? এক্স কোন নম্বর বা হেক্স নম্বর নয়?
কলাত

4
@ কাজরজজারস - 0x(বা 0X) উপসর্গটি জাভাতে জানায় যে এরপরে পূর্ণসংখ্যার আক্ষরিক পরে হেক্স (বেস 16) হিসাবে ব্যাখ্যা করা উচিত। জাভা 0অষ্টাল আক্ষরিক জন্য একটি খালি উপসর্গ এবং বাইনারি আক্ষরিক জন্য একটি 0b(বা 0B) উপসর্গ সমর্থন করে । দেখুন জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন পূর্ণসংখ্যা লিটারেল আরও তথ্যের জন্য।
টেড হপ

আক্ষরিক যে অনুসরণ? সুতরাং উদাহরণস্বরূপ যদি আমি 0x3fa ছিল। 3ফা অংশটি একটি আক্ষরিক সংখ্যায় অনুবাদ করা হচ্ছে এবং 0x "এটি একটি হেক্স নম্বর" উল্লেখ করছে? @ টেডহপ?
কল্যাট

4
@ কাজরডজার্স - একদম ঠিক। মনে রাখবেন 0xবা 0bনিজেই (কোনও অঙ্ক নিম্নলিখিত ছাড়াই) জাভাতে অবৈধ বাক্য গঠন।
টেড হপ

4
@ দিমিত্রিমিনকোভস্কি - fe৮-বিটের হেক্স বিট প্যাটার্ন , দুটির পরিপূরক দশমিক মান −2 এর সাথে মিলে। মান সংরক্ষণ করার Integer.valueOf(byte)জন্য, উত্পাদন করতে হবে ff ff ff fe(32-বিট −2, দুইটির পরিপূরক), নয় 00 00 00 fe(দশমিক মান 254)। এই রূপান্তরটি (একটি byteমান feথেকে একটি intমান ff ff ff fe) সাইন এক্সটেনশন হিসাবে পরিচিত এবং জাভা ভাষার স্পেসিফিকেশনের অংশ। এর উদ্দেশ্য value & 0xffহ'ল সাইন এক্সটেনশানটি পূর্বাবস্থায় ফেলা (অর্থাত শূন্য এক্সটেনশন সিমুলেট করা, জাভাতে কিছু নেই)।
টেড হপ

59

Http://www.coderanch.com/t/236675/java-programmer-SCJP/cerificationsation/xff থেকে

হেক্সাস আক্ষরিক 0xFF একটি সমান আন্ত (255)। জাভা 32 বিট হিসাবে int উপস্থাপন করে। এটি বাইনারি এ দেখতে দেখতে:

00000000 00000000 00000000 11111111

আপনি যখন কোনও সংখ্যায় কিছুটা বুদ্ধিমান এবং এই মানটি (255) দিয়ে করেন তবে এটি সংখ্যার সর্বনিম্ন 8 বিট ব্যতীত (জেরোগুলি তৈরি করতে) মাস্কিং করতে চলেছে।

... 01100100 00000101 & ...00000000 11111111 = 00000000 00000101

এবং% ভালো কিছু কিন্তু নয় সত্যিই

এবং কেন 0xff? এটিতে (2 পাওয়ার) - 1)। সমস্ত (2 পাওয়ার) - 1) (যেমন 7, 255 ...)% অপারেটরের মতো কিছু আচরণ করবে।

তারপরে
বাইনারি, 0 হয়, সমস্ত শূন্য এবং 255 এর মত দেখাচ্ছে:

00000000 00000000 00000000 11111111

এবং -1 এর মত দেখাচ্ছে

11111111 11111111 11111111 11111111

আপনি যখন 0xFF এর কিছুটা দিকে এবং 0 থেকে 255 পর্যন্ত কোনও মান করেন, ফলাফলটি মানটির মতো হুবহু। 255 এরও বেশি মান যদি এখনও থাকে তবে ফলাফল 0-255 এর মধ্যে আসবে।

তবে, আপনি যদি:

-1 & 0xFF

তুমি পাও

00000000 00000000 00000000 11111111, যা -1 এর মূল মানের সমান হয় না ( 11111111দশমিক 255 হয়)।


আরও কয়েকটি বিট কারসাজি: (প্রশ্নের সাথে সম্পর্কিত নয়)

X >> 1 = X/2
X << 1 = 2X

কোনও নির্দিষ্ট বিট (1) সেট করা আছে কিনা তা পরীক্ষা করুন (0) তারপরে না

 int thirdBitTobeChecked =   1 << 2   (...0000100)
 int onWhichThisHasTobeTested = 5     (.......101)

 int isBitSet = onWhichThisHasTobeTested  & thirdBitTobeChecked;
 if(isBitSet > 0) {
  //Third Bit is set to 1 
 } 

(1) একটি নির্দিষ্ট বিট সেট করুন

 int thirdBitTobeSet =   1 << 2    (...0000100)
 int onWhichThisHasTobeSet = 2     (.......010)
 onWhichThisHasTobeSet |= thirdBitTobeSet;

একটি নির্দিষ্ট বিট পুনরায় সেট (0)

int thirdBitTobeReSet =   ~(1 << 2)  ; //(...1111011)
int onWhichThisHasTobeReSet = 6      ;//(.....000110)
onWhichThisHasTobeReSet &= thirdBitTobeReSet;

এক্সওআর

কেবলমাত্র নোট করুন যে আপনি যদি দুটিবার এক্সওআর অপারেশন করেন তবে একই মানটির ফলাফল হবে।

byte toBeEncrypted = 0010 0110
byte salt          = 0100 1011

byte encryptedVal  =  toBeEncrypted ^ salt == 0110 1101
byte decryptedVal  =  encryptedVal  ^ salt == 0010 0110 == toBeEncrypted :)

এক্সওআর নিয়ে আরও একটি যুক্তি হ'ল

if     A (XOR) B == C (salt)
then   C (XOR) B == A
       C (XOR) A == B

উপরেরটি নীচের মতো অস্থায়ীভাবে দুটি পরিবর্তনশীল অদলবদল করতে দরকারী

a = a ^ b; b = a ^ b; a = a ^ b;

বা

a ^= b ^= a ^= b;

এছাড়াও বর্ণন @ বিট ম্যানিপুলেশন আছে stackoverflow.com/questions/13422259/...
Kanagavelu Sugumar


5

এটি প্রচুর কোড হ্রাস করতে সহায়তা করে। এটি মাঝে মধ্যে আরজিবি মানগুলিতে ব্যবহৃত হয় যা 8 বিট নিয়ে গঠিত।

যেখানে 0xff অর্থ 24 (0 এর) এবং 8 (1 এর) পছন্দ00000000 00000000 00000000 11111111

এটি কার্যকরভাবে ভেরিয়েবলটি মাস্ক করে তাই এটি সর্বশেষ 8 টি বিটের মধ্যে কেবলমাত্র মান রেখে যায় এবং বাকী সমস্ত বিট উপেক্ষা করে

এটি বেশিরভাগ ক্ষেত্রে দেখা যায় যখন রঙের মানগুলি একটি বিশেষ ফর্ম্যাট থেকে স্ট্যান্ডার্ড আরজিবি মানগুলিতে রূপান্তর করার চেষ্টা করা হয় (যা 8 বিট দীর্ঘ)।

দুর্দান্ত ব্যাখ্যা এখানে দেখুন


0

32 বিট ফর্ম্যাট সিস্টেমে হেক্সাডেসিমাল মান দশমিক যেটি 0xffউপস্থাপন 00000000000000000000000011111111করে 255(15*16^1+15*16^0)। এবং বিটওয়াইস এবং অপারেটর প্রথম অপারেন্ডের মতো একই 8 ডান সর্বাধিক বিটকে মাস্ক করে।


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