বিগ ইন্টিজার ৪

Bitwise অপারেশন
বিগ ইন্টিজারেও আমরা বিট-ওয়াইজ অপারেশন করতে পারি। এজন্য BigInteger ক্লাসে কিছু বিল্ট-ইন মেথড রয়েছে।

AND (a&b): বিগ ইন্টিজারের বিট-ওয়াইজ AND ভ্যালু বের করার জন্য রয়েছে and() মেথড। দুটি বিগ ইন্টিজার a এবং b-এর AND ভ্যালু বের করতে চাইলে লিখতে হবে –
BigInteger ans = a.and(b);

OR (a|b): বিগ ইন্টিজারের বিট-ওয়াইজ OR ভ্যালু বের করার জন্য রয়েছে or() মেথড। দুটি বিগ ইন্টিজার a এবং b-এর OR ভ্যালু বের করতে চাইলে আমাদের লিখতে হবে –
BigInteger ans = a.or(b);

XOR (a^b): বিগ ইন্টিজারে xor() মেথড টি দিয়ে বিট-ওয়াইজ XOR বা Exclusive OR ভ্যালু বের করা হয়। দুটি বিগ ইন্টিজার a এবং b এর XOR ভ্যালু বের করতে চাইলে আমাদের লিখতে হবে-
BigInteger ans = a.xor(b);

NOT (~a): বিগ ইন্টিজারের বিট-ওয়াইজ NOT ভ্যালু বের করার জন্য রয়েছে not() মেথড। কোন একটি বিগ ইন্টিজার a এর NOT ভ্যালু বের করতে চাইলে আমাদের লিখতে হবে-
BigInteger ans = a.not();

Shift-Left (a<<n): আমরা চাইলে বিগ ইন্টিজারের বিটগুলোকে শিফটও করতে পারি। বিটগুলোকে বাম দিকে শিফট করার জন্য আমাদেরকে shiftLeft() মেথডটি ব্যবহার করতে হবে। মেথডটি প্যারামিটারে একটি ইন্টিজার সংখ্যা নিয়ে থাকে। একটি নাম্বারের বিটগুলোকে আমরা বাম দিকে কত বিট শিফট করবো এটি হচ্ছে তার মান। কোনো একটি সংখ্যা a-কে আমরা যদি n বিট বামে শিফট করতে চাই, তাহলে লিখতে হবে –
BigInteger ans = a. shiftLeft(n);

Shift-Right (a>>n): বিগ ইন্টিজারের বিট গুলো কে ডান দিকে শিফট করার জন্য আমাদেরকে shiftRight() মেথডটি ব্যবহার করতে হবে। এটি shiftLeft() মেথডটির মতই। কোনো একটি সংখ্যা a-কে আমরা যদি n বিট ডানে শিফট করতে চাই, তাহলে লিখতে হবে –
BigInteger ans = a.shiftRight(n);

Test-Bit (a&(1<<n)): একটি বিগ ইন্টিজারের n-তম বিটটি 0 নাকি 1, তা বের করার জন্য BigInteger ক্লাসে আছে testBit() মেথড। মেথডটি প্যারামিটারে n-এর মান নেয় এবং n-তম বিট 1 হলে true রিটার্ন করে, আর 0 হলে false রিটার্ন করে। এখন আমরা যদি কোনো একটি সংখ্যা a-এর n-তম বিট পরীক্ষা করতে চাই, তাহলে লিখতে হবে-
boolean flag = a.testBit(n);

Clear-Bit (a & ~(1<<n)): একটি বিগ ইন্টিজারের কোনো একটি বিটকে 0 করতে হলে আমাদের clearBit() মেথডটি ব্যবহার করতে হবে। কোনো একটি সংখ্যা a-এর n-তম বিটকে 0 করতে চাইলে আমাদের লিখতে হবে-
BigInteger ans = a.clearBit(n);

Set-Bit (a|(1<<n)): একটি বিগ ইন্টিজারের কোনো একটি বিটকে 1 করতে হলে আমাদের setBit() মেথডটি ব্যবহার করতে হবে। কোনো একটি সংখ্যা a-এর n-তম বিটকে 1 করতে চাইলে আমাদের লিখতে হবে –
BigInteger ans = a.setBit(n);

Flip-Bit (a ^ (1<<n)): একটি বিগ ইন্টিজারের কোনো একটি বিটকে ফ্লিপ করতে হলে অর্থাৎ 0 থাকলে 1 করতে অথবা 1 থাকলে 0 করতে চাইলে আমাদের flipBit() মেথডটি ব্যবহার করতে হবে। কোনো একটি সংখ্যা a-এর n-তম বিটকে ফ্লিপ করতে চাইলে আমাদের লিখতে হবে-
BigInteger ans = a.flipBit(n);

AND-NOT (a & ~b): দুটি বিগ ইন্টিজারের বিট-ওয়াইজ AND-NOT ভ্যালু বের করতে চাইলে andNot() মেথডটি ব্যবহার করতে হবে। দুটি বিগ ইন্টিজার a এবং b এর AND-NOT ভ্যালু বের করতে চাইলে আমাদের লিখতে হবে-
BigInteger ans = a.andNot(b);

Lowest Set Bit (log2(a & -a)): কোনো সংখ্যার সবচেয়ে ছোট কোন বিটে 1 আছে, তা বের করার জন্য বিগ ইন্টিজারে getLowestSetBit() মেথড আছে। কোনো একটি বিগ ইন্টিজার a-এর সবচেয়ে ছোট কোন বিটটি 1 তা বের করতে চাইলে আমাদের লিখতে হবে –
int ans = a.getLowestSetBit();

আরো কিছু প্রয়োজনীয় মেথড
toString(): বিগ ইন্টিজার কে স্ট্রিং এ কনভার্ট করতে ব্যবহার করা হয়।
toByteArray(): বিগ ইন্টিজার কে বাইট-অ্যারে তে কনভার্ট করতে ব্যবহার করা হয়।
negate(): বিগ ইন্টিজারের সাইন পরিবর্তন করতে ব্যবহার করা হয়।
bitCount(): কোন সংখ্যার 2’s complement এ সাইন বিটের বিপরীত কয়টি বিট আছে তা বের করার জন্য ব্যবহার করা হয়।
bitLength(): একটি সংখ্যা কে বাইনারি বেইজে রিপ্রেজেন্ট করতে (সাইন বিট ছাড়া) কয়টি বিটের প্রয়োজন তা জানার জন্য ব্যবহার করা হয়।
signum(): কোন সংখ্যা ধনাত্মক, ঋণাত্মক অথবা শূন্য কি না তা জানার জন্য ব্যবহার করা হয়। ধনাত্মক হলে 1, ঋণাত্মক হলে -1 এবং শূন্য হলে মেথড টি 0 রিটার্ন করে।
intValue(): BigInteger থেকে int ডাটায় কনভার্ট করতে ব্যবহার করা হয়। তবে এ ক্ষেত্রে ডাটা ওভারফ্লো হলে মেথড টি কোন এক্সেপশন থ্রো করে না। এক্ষেত্রে intValueExact() ব্যবহার করলে এই মেথড টি এক্সেপশন থ্রো করে।
longValue(): BigInteger থেকে long ডাটায় কনভার্ট করতে ব্যবহার করা হয়। এই মেথড টি ও ডাটা ওভারফ্লো হলে এক্সেপশন থ্রো করে না। এক্ষেত্রে longValueExact() ব্যবহার করলে এই মেথড টি এক্সেপশন থ্রো করে।
floatValue(): BigInteger থেকে float ডাটায় কনভার্ট করতে ব্যবহার করা হয়।
doubleValue(): BigInteger থেকে double ডাটায় কনভার্ট করতে ব্যবহার করা হয়।
hashCode(): হ্যাশ-কোড বের করার জন্য ব্যবহার করা হয়।
divideAndRemainder(): মেথড টি দুটি সংখ্যার ভাগফল এবং ভাগশেষ এক সাথে একটি BigInteger অ্যারে আকারে রিটার্ন করে। রিটার্ন করা অ্যারে টির [0] ইন্ডেক্সে থাকে ভাগফলের মান এবং [1] ইন্ডেক্সে থাকে ভাগশেষ এর মান।

import java.util.*;
import java.math.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner (System.in); 
        BigInteger a=sc.nextBigInteger();
        BigInteger b=sc.nextBigInteger();
        BigInteger arr[] = a.divideAndRemainder(b); 
        System.out.println("Quotient = "+arr[0]);
        System.out.println("Remainder = "+arr[1]); 
    }
}

এই ছিলো আমাদের BigInteger নিয়ে আলোচনা। Java-তে BigDecimal নামে আরো একটি ক্লাস আছে যা দিয়ে Decimal সংখ্যার হিসাব নিকাশ করা যায়। এটির ব্যবহার BigInteger-এর মতোই।

Facebook Comments

Leave a Reply