জাভাতে স্বাক্ষরবিহীন ইন্ট ঘোষণা


316

জাভাতে স্বাক্ষরবিহীন কোন ঘোষণা দেওয়ার কোনও উপায় আছে?

অথবা প্রশ্নটিও এইভাবে ফ্রেম করা যেতে পারে: স্বাক্ষরবিহীন জাভা সমতুল্য কী?

আমি আপনাকে জাভা বাস্তবায়নের দিকে তাকিয়ে ছিলাম সেই প্রসঙ্গে বলার জন্য String.hashcode()। পূর্ণসংখ্যা 32 স্বাক্ষরবিহীন না হলে আমি সংঘর্ষের সম্ভাবনাটি পরীক্ষা করতে চেয়েছিলাম।


7
জাভাতে কোনও স্বাক্ষরবিহীন প্রকার নেই।
অ্যান্ড্রু লগভিনভ

1
এই পোস্টটি আপনাকে stackoverflow.com/a/4449161/778687
tusar

2
এএএএএফসিটি কোনও উপায় বলে মনে হচ্ছে না। সম্পর্কিত: স্ট্যাকওভারফ্লো.com
জেমস ম্যানিং

11
এটি আপনি যে উদ্দেশ্যটি অর্জন করার চেষ্টা করছেন তার উপর নির্ভর করে। বেশিরভাগ উদ্দেশ্যে, জাভাতে সমস্ত পূর্ণসংখ্যার স্বাক্ষরিত। তবে, আপনি একটি নির্দিষ্ট ক্ষেত্রে স্বাক্ষরিত হিসাবে একটি স্বাক্ষরিত পূর্ণসংখ্যার আচরণ করতে পারেন : আপনি >>>পরিবর্তে অপারেটর ব্যবহার করে সাইন না বাড়িয়ে ডান স্থানান্তর করতে পারেন >>
dasblinkenlight

উত্তর:


310

স্বাক্ষরবিহীন পূর্ণসংখ্যার জন্য জাভাতে কোনও ডেটাটাইপ নেই ।

আপনার যদি বড় মূল্যবোধ সঞ্চয় করতে হয় তবে আপনি longতার পরিবর্তে একটি সংজ্ঞা দিতে intপারেন।

আপনি স্বাক্ষরযুক্ত পূর্ণসংখ্যা ব্যবহার করতে পারেন যেমন এটি স্বাক্ষরযুক্ত were দু'জনের পরিপূরক প্রতিনিধিত্বের সুবিধাটি হ'ল সর্বাধিক ক্রিয়াকলাপগুলি (যেমন সংযোজন, বিয়োগ, গুণ এবং বাম শিফট) স্বাক্ষরিত এবং স্বাক্ষরবিহীন পূর্ণসংখ্যার জন্য বাইনারি স্তরে অভিন্ন। কয়েকটি অপারেশন (বিভাগ, ডান শিফট, তুলনা এবং castালাই) অবশ্য আলাদা। জাভা এসই 8 হিসাবে, Integerক্লাসে নতুন পদ্ধতি আপনাকে স্বাক্ষরবিহীন গাণিতিক সম্পাদন করতেint ডেটা টাইপকে পুরোপুরি ব্যবহার করতে দেয় :

জাভা এসই 8 এবং তার পরে, আপনি স্বাক্ষরবিহীন 32-বিট পূর্ণসংখ্যা উপস্থাপন করতে তথ্য উপাত্তটি ব্যবহার করতে পারেন, যার সর্বনিম্ন মান 0 এবং সর্বোচ্চ 2 2 32-1 হয়। স্বাক্ষরবিহীন পূর্ণসংখ্যার হিসাবে int ডেটা টাইপ ব্যবহার করতে পূর্ণসংখ্যা শ্রেণিটি ব্যবহার করুন। মত স্ট্যাটিক পদ্ধতি compareUnsigned, divideUnsignedইত্যাদি স্বাক্ষরবিহীন পূর্ণসংখ্যার জন্য গাণিতিক অপারেশন সমর্থন করার জন্য পূর্ণসংখ্যা ক্লাসে যোগ করা হয়েছে।

নোট করুন যে intঘোষিত চলাকালীন এখনও ভেরিয়েবলগুলি স্বাক্ষরিত হয় তবে স্বাক্ষরযুক্ত গাণিতিকগুলি Integerক্লাসে methods পদ্ধতিগুলি ব্যবহার করে এখন সম্ভব ।


11
সত্য কথা বলতে গেলে, অনেক প্রকল্পের জন্য প্রযুক্তিগত প্রয়োজনীয়তাগুলি কঠোর নয় এবং আপনি সত্যিকারের মতো স্মৃতি "নষ্ট" করতে পারবেন।
সাইমন ভিজার

6
আমি জানি, আমি জাভার মূল উদ্দেশ্যটিও বুঝতে পারি। তবে উদাহরণস্বরূপ স্মার্টফোনগুলি অতিরিক্ত মেমোরি দিয়ে নিষ্পত্তি করে না। এবং তারা সাধারণত জাভা ব্যবহার করে, যতদূর আমি জানি। তবে ভাল, আমি জাভা প্রগ্রেমার এবং অন্যদের মধ্যে যুদ্ধ শুরু করতে চাই না।
টোমা জ্যাটো - মনিকা

122
আমার কাছে এটি কেবল অর্থ অপচয় করার ঘটনা নয়। আপনি যখন কিছুটা স্তরে কাজ করেন, স্বাক্ষরযুক্ত না থেকে কাজ করা সহজ
ক্র্যাঙ্কার

24
জাভা 8 হিসাবে, এটি আর সত্য নয় । জাভা এসই 8 এবং তার পরে, আপনি intএকটি স্বাক্ষরবিহীন 32-বিট পূর্ণসংখ্যা উপস্থাপন করতে ডেটা টাইপ ব্যবহার করতে পারেন , যার সর্বনিম্ন মান 0এবং সর্বাধিক মান থাকে 2^32-1। - ডকস.ওরকল / জাভ্যাস
টিউটোরিয়াল /

2
@ 7 স্পেশাল জিমেস: আমি সেই তথ্য অন্তর্ভুক্ত করার জন্য উত্তর আপডেট করেছি। বলা হচ্ছে যে, স্বাক্ষরবিহীন পূর্ণসংখ্যাগুলি ঘোষণা করা বা নেতিবাচক মানগুলি বাদ দেওয়া সম্ভব নয়, এটি কেবলমাত্র কোনও intপদ্ধতি ব্যবহার করে স্বাক্ষরবিহীন হিসাবে ব্যবহার করা সম্ভব ।
শিমোন দর্শক

70

1
@ স্টাসে স্বাক্ষরবিহীন ডেটাটাইপগুলি ব্যবহার করার ক্ষমতা রাখার বিষয়ে ব্যবহার এবং বড় বিষয় বুঝতে আমার অসুবিধা হচ্ছে। অনলাইনে আমি যে বিভিন্ন উত্স থেকে পড়েছি তা থেকে মনে হয় এটি সর্বাধিক মানকে প্রশস্ত করার আশেপাশে ঘোরে এবং প্রকৃতির গ্যারান্টি দিয়ে গ্যারান্টি দেয় যে এটি একটি ধনাত্মক সংখ্যা। আমার বোধগম্যতা কি সঠিক, নাকি অন্য কোনও বড় কারণ আছে? এছাড়াও, এখন Integerজাভা 8- এর ক্লাসটি স্বাক্ষরবিহীন কোনটি ব্যবহার করতে দেয়, কেবল স্থান এবং গতির মধ্যে পার্থক্য (যেহেতু সি / সি ++ এ তারা আদিম, জাভাতে, এটি পুরো অবজেক্টের মোড়ক)
আব্দুল

2
@ আবদুল - আপনি যখন বিট স্তরে কাজ করেন (সাধারণত আপনি হার্ডওয়্যারের সাথে হস্তক্ষেপ করছেন) তাই আপনাকে একটি নির্দিষ্ট উপায়ে আচরণ করার জন্য মূল্যবান হওয়া প্রয়োজন। যেমন - 11111111 থেকে শুরু করে 00000000 ইত্যাদি। স্বাক্ষরবিহীন জায়গায় সাইন ইন ব্যবহার করা সিআরসি গণনাগুলি ভেঙে দিতে পারে ইত্যাদি এটি কোনও শো স্টপার নয়, কেবল সময় নষ্ট করা।
লার্ন কে

3
@ লার্ন কে: জাভাতে, intসাইন ইন করা সত্ত্বেও, রোল ওভার। এটি সি / সি ++ যেখানে স্বাক্ষরবিহীন রোলগুলি গড়িয়ে পড়ে, কিন্তু স্বাক্ষরিত কারণে ওভারফ্লোতে "অপরিজ্ঞাত আচরণ" হয়। যদি "রোলিং ওভার" আপনার একমাত্র উদ্বেগ, আপনার স্বাক্ষরযুক্ত নয় need আমার ধারণা, এজন্যই সিআরসি রুটিন ইত্যাদি অতিরিক্ত চেষ্টা ছাড়াই জাভাতে কাজ করে। এবং এ কারণেই নতুন এপিআই কেবল বিশ্লেষণ, ফর্ম্যাটিং, তুলনা, ভাগ এবং বাকিগুলি যুক্ত করে। অন্যান্য সমস্ত ক্রিয়াকলাপ, যথা সমস্ত বিট ম্যানিপুলেশন, তবে সংযোজন, বিয়োগ, গুণ, ইত্যাদি যে কোনও উপায়ে সঠিক কাজ করছে।
হোলার

4
@ সিপ্রিয়ান টোমাইগা: রোলওভার যুক্ত করার জন্য, ইনপুটটির বিট নিদর্শনগুলি এবং ফলাফলটি আপনি স্বাক্ষরিত নম্বর বা স্বাক্ষরযুক্ত নম্বর হিসাবে ব্যাখ্যা করছেন কিনা তার উপর নির্ভর করে না। আপনার যদি ধৈর্য থাকে তবে আপনি এটি সমস্ত 2⁶⁵ টি সংমিশ্রণ দিয়ে চেষ্টা করতে পারেন…
হোলগার

3
@ ব্যাখ্যার জন্য বৃহত্তর ধন্যবাদ! প্রকৃতপক্ষে, দেখা যাচ্ছে যে আমরা আসলে 2 এর পরিপূরক ব্যবহার করি। আমি এটি প্রায় 2 ^ 8 টি সংমিশ্রণ দিয়ে চেষ্টা করেছিলাম
সিপরিয়ান টমোইগা

66

কোনও ইনট-এর কোনও মান স্বাক্ষরিত বা স্বাক্ষরিত কিনা তা নির্ভর করে কীভাবে বিটগুলি ব্যাখ্যা করা যায় - জাভা বিটকে স্বাক্ষরিত মান হিসাবে ব্যাখ্যা করে (এতে স্বাক্ষরযুক্ত আদিমগুলি নেই)।

যদি আপনার কোন অন্তর্নিহিত থাকে যে আপনি একটি স্বাক্ষরবিহীন মান হিসাবে ব্যাখ্যা করতে চান (উদাহরণস্বরূপ আপনি এমন কোনও ডাটা ইনপুটস্ট্রিম থেকে একটি ইনট পড়েছেন যা আপনি জানেন যে একটি স্বাক্ষরযুক্ত মান রয়েছে) তবে আপনি নিম্নলিখিত কৌশলটি করতে পারেন।

int fourBytesIJustRead = someObject.getInt();
long unsignedValue = fourBytesIJustRead & 0xffffffffl;

দ্রষ্টব্য, যে এটি গুরুত্বপূর্ণ যে হেক্স আক্ষরিক একটি দীর্ঘ আক্ষরিক, কোনও অন্তঃসৃষ্ট শব্দ নয় - অতএব শেষে 'এল'।


3
আমার জন্য এটি সর্বোত্তম উত্তর ... আমার ডেটা এনএফসি কার্ড ইউআইডি থেকে আসে, এতে 4 বা 8 বাইট থাকতে পারে ... 4 বাইটের ক্ষেত্রে আমার এটি স্বাক্ষরবিহীন কোনটিতে ফেলে দেওয়ার দরকার ছিল, এবং আমি পারিনি ByteBuffer.getLong ব্যবহার করুন কারণ এটি 64৪-বিট ডেটা ছিল না। ধন্যবাদ।
লাউডেনভিয়ার

কেন এটি দীর্ঘ হতে হবে। আপনি কি শুধু করতে 0xFFFFFFএবং অন্তর্নিহিত রাখতে পারবেন না ?
ডিসপ্লে

19

আমরা মডেল স্বাক্ষরবিহীন সংখ্যার প্রয়োজন মাইএসকিউএল এর স্বাক্ষরবিহীন TINYINT, SMALLINT, INT, BIGINTমধ্যে jOOQ , যার কারণে আমরা তৈরি করেছেন jOOU , জাভা স্বাক্ষরবিহীন পূর্ণসংখ্যা সংখ্যার জন্য ধরনের মোড়কের একটি minimalistic গ্রন্থাগার নৈবেদ্য। উদাহরণ:

import static org.joou.Unsigned.*;

// and then...
UByte    b = ubyte(1);
UShort   s = ushort(1);
UInteger i = uint(1);
ULong    l = ulong(1);

এই সমস্ত ধরণের প্রসারিত হয় java.lang.Numberএবং উচ্চতর ক্রমের আদিম ধরণের এবং রূপান্তরিত হতে পারে BigInteger। আশাকরি এটা সাহায্য করবে.

(অস্বীকৃতি: আমি এই লাইব্রেরির পিছনে সংস্থার হয়ে কাজ করি)


এটি খুব সুবিধাজনক মনে হচ্ছে! উল্লেখ করার জন্য ধন্যবাদ। :)
লুকাস সউসা

7

স্বাক্ষরবিহীন সংখ্যার জন্য আপনি এই ক্লাসগুলি পেয়ারা লাইব্রেরি থেকে ব্যবহার করতে পারেন :

তারা বিভিন্ন অপারেশন সমর্থন:

  • যোগ
  • ঋণচিহ্ন
  • বার
  • গেলিক ভাষার
  • দ্বারা বিভক্ত

এই মুহুর্তে যে জিনিসটি অনুপস্থিত মনে হচ্ছে তারা হলেন বাইট শিফট অপারেটরগুলি। আপনার যদি প্রয়োজন হয় তবে আপনি জাভা থেকে বিগইন্টিজার ব্যবহার করতে পারেন।


4

char16 বিট স্বাক্ষরবিহীন পূর্ণসংখ্যার জন্য ব্যবহার করুন ।


চর 32 বিট স্বাক্ষরযুক্ত ইন্ট নয় তবে চর মেমরি লাভের জন্য একটি ভাল উত্তর। এই লিঙ্কে: stackoverflow.com/questions/1841461/unsigned-short-in-java (jqr থেকে উপরে)
blobmaster

2

সম্ভবত এই আপনি কি বোঝাতে চেয়েছিলেন?

long getUnsigned(int signed) {
    return signed >= 0 ? signed : 2 * (long) Integer.MAX_VALUE + 2 + signed;
}
  • getUnsigned(0) → 0
  • getUnsigned(1) । 1
  • getUnsigned(Integer.MAX_VALUE) 4 2147483647
  • getUnsigned(Integer.MIN_VALUE) 4 2147483648
  • getUnsigned(Integer.MIN_VALUE + 1) 4 2147483649

আপনি যদি বিবৃতিগুলির পরিবর্তে টের্নারি অপারেটরগুলির সাথে অলস টাইপিংয়ের জন্য পারফরম্যান্স সময়টির এক সেকেন্ডের ত্যাগ করে। ভাল না. (মজা করে)
ytpillai

5
আপনি কি সত্যিই ভাবেন, এর 2 * (long) Integer.MAX_VALUE + 2চেয়ে বোঝা সহজ 0x1_0000_0000L? সে ক্ষেত্রে, কেন সহজভাবে নয় return signed & 0xFFFF_FFFFL;?
হোলার

2

দেখে মনে হচ্ছে আপনি ব্যবহারের আগে মানগুলিতে "লজিক্যাল এ্যান্ড" করে সাইন ইন করার সমস্যাটি পরিচালনা করতে পারেন:

উদাহরণ (মূল্য byte[] header[0]হয় 0x86):

System.out.println("Integer "+(int)header[0]+" = "+((int)header[0]&0xff));

ফলাফল:

Integer -122 = 134

2

এখানে ভাল উত্তর আছে, কিন্তু আমি বিটওয়াইজ অপারেশনগুলির কোনও বিক্ষোভ দেখতে পাচ্ছি না। দর্শকের মতো (বর্তমানে গৃহীত উত্তর) বলেছেন, জাভা ডিফল্ট অনুসারে পূর্ণ সংখ্যার সাথে স্বাক্ষর করে (জাভা 8 স্বাক্ষরবিহীন পূর্ণসংখ্যার চিহ্ন রয়েছে, তবে আমি সেগুলি কখনও ব্যবহার করি নি)। আরও অগ্রণী ছাড়া, আসুন এটি করা ...

আরএফসি 868 উদাহরণ

আপনার যদি আইও-তে স্বাক্ষরবিহীন পূর্ণসংখ্যার লেখার দরকার হয় তবে কী হবে? ব্যবহারিক উদাহরণ হ'ল আপনি যখন আরএফসি 868 অনুসারে সময় আউটপুট করতে চান । এর জন্য একটি 32-বিট, বড়-এন্ডিয়ান, স্বাক্ষরবিহীন পূর্ণসংখ্যার প্রয়োজন যা 1 জানুয়ারী, ১৯00, সকাল 12:00 থেকে সেকেন্ডের সংখ্যাকে এনকোড করে you আপনি কীভাবে এটি এনকোড করবেন?

আপনার নিজের স্বাক্ষরযুক্ত 32-বিট পূর্ণসংখ্যার মতো করুন:

4 বাইট (32 বিট) এর বাইট অ্যারে ঘোষণা করুন

Byte my32BitUnsignedInteger[] = new Byte[4] // represents the time (s)

এটি অ্যারে সূচনা করে, দেখুন বাইট অ্যারেগুলি কি জাভাতে শূন্যের দিকে শুরু করা হয়েছে? । এখন আপনাকে বিগ-এন্ডিয়ান অর্ডারে (বা আপনি যদি সর্বনাশ করতে চান তবে লিটল-এন্ডিয়ান) তথ্য সহ প্রতিটি বাইট পূরণ করতে হবে। ধরুন আপনার জাভাতে দীর্ঘ সময় রয়েছে (জাভাতে দীর্ঘ পূর্ণসংখ্যাগুলি b৪ বিট দীর্ঘ) আপনি secondsSince1900(যা শুধুমাত্র প্রথম ৩২ বিট মূল্যের ব্যবহার করে এবং আপনি যে তারিখের রেফারেন্সটি জানুয়ারীর ১ জানুয়ারি, ১৯ 1970০ তারিখের উল্লেখ করেছেন) তা পরিচালনা করেছেন আপনি এগুলি থেকে বিটগুলি বের করতে এবং সেই বিটগুলিকে পজিশনে (অঙ্কগুলিতে) স্থানান্তর করতে লজিক্যাল এ্যান্ড ব্যবহার করতে পারেন যা বাইটে ঝাঁকিয়ে দেওয়া এবং বিগ-এন্ডিয়ান অর্ডারে উপেক্ষা করা হবে না।

my32BitUnsignedInteger[0] = (byte) ((secondsSince1900 & 0x00000000FF000000L) >> 24); // first byte of array contains highest significant bits, then shift these extracted FF bits to first two positions in preparation for coersion to Byte (which only adopts the first 8 bits)
my32BitUnsignedInteger[1] = (byte) ((secondsSince1900 & 0x0000000000FF0000L) >> 16);
my32BitUnsignedInteger[2] = (byte) ((secondsSince1900 & 0x000000000000FF00L) >> 8);
my32BitUnsignedInteger[3] = (byte) ((secondsSince1900 & 0x00000000000000FFL); // no shift needed

আমাদের my32BitUnsignedInteger এখন একটি স্বাক্ষরযুক্ত 32-বিট, বিগ-এন্ডিয়ান পূর্ণসংখ্যার সমতুল্য যা আরসিএফ 868 স্ট্যান্ডার্ডকে মেনে চলে। হ্যাঁ, লম্বা ডেটাটাইপটি স্বাক্ষরিত হয়েছে, তবে আমরা সেই সত্যটিকে উপেক্ষা করেছি কারণ আমরা ধরে নিয়েছি যে সেকেন্ডসিন্স ১৯০০ কেবলমাত্র নীচের ৩২ বিট ব্যবহার করেছে)। দীর্ঘকে বাইটে চাপিয়ে দেওয়ার কারণে, 2 ^ 7 (হেক্সের প্রথম দুটি অঙ্ক) এর চেয়ে বেশি সমস্ত বিট উপেক্ষা করা হবে।

উত্স রেফারেন্স: জাভা নেটওয়ার্ক প্রোগ্রামিং, চতুর্থ সংস্করণ।


1

সবেমাত্র এই কোডের টুকরো তৈরি করেছে, যেটি "this.altura" ને নেতিবাচক থেকে ধনাত্মক সংখ্যায় রূপান্তর করে। আশা করি এটি অভাবী কাউকে সহায়তা করবে

       if(this.altura < 0){    

                        String aux = Integer.toString(this.altura);
                        char aux2[] = aux.toCharArray();
                        aux = "";
                        for(int con = 1; con < aux2.length; con++){
                            aux += aux2[con];
                        }
                        this.altura = Integer.parseInt(aux);
                        System.out.println("New Value: " + this.altura);
                    }

-19

আপনি ম্যাথ.এবস (সংখ্যা) ফাংশনটি ব্যবহার করতে পারেন। এটি একটি ইতিবাচক নম্বর দেয়।


12
নিতপিক: আপনি যদি পাস করেন নাMIN_VALUE
ডেনিস মেং

2
@ kyo722 আমি কল্পনাও করতে পারি না যে এটি স্বাক্ষরযুক্ত আদিমদের পরিসীমাতে ইতিবাচক মান প্রদান করবে।
ফ্লোরিয়ান আর ক্লিন

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