কম্পিউটার টিউটোরিয়াল

সি প্রোগ্রাম দিয়ে বিট রোটেশন (Bit Rotation) বাম/ডান

বিট রোটেশন (Bit Rotation) কী?

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

  • লেফট রোটেশন: বিটগুলো বামে শিফট, MSB বের হয়ে LSB-এ যোগ হয়।
  • রাইট রোটেশন: বিটগুলো ডানে শিফট, LSB বের হয়ে MSB-এ যোগ হয়।

লেফট রোটেশন লজিক

MSB = (num >> (size-1)) & 1;  // MSB ক্যাপচার
num = (num << 1) | MSB;       // বামে শিফট + MSB LSB-এ যোগ

রাইট রোটেশন লজিক

LSB = num & 1;                // LSB ক্যাপচার
num = (num >> 1) | (LSB << (size-1)); // ডানে শিফট + LSB MSB-এ যোগ

প্রোগ্রাম ১: লেফট রোটেশন

#include <stdio.h>
#include <stdlib.h>

int main() {
    int num, rotate;
    int size = sizeof(int) * 8; // 32 bits

    printf("Enter number: ");
    scanf("%d", &num);
    printf("Enter rotations: ");
    scanf("%d", &rotate);

    rotate %= size; // রোটেশন সংখ্যা নরমালাইজ

    while (rotate--) {
        int msb = (num >> (size - 1)) & 1;
        num = (num << 1) | msb;
    }

    printf("After left rotation: %d\n", num);
    return 0;
}

আউটপুট

Enter number: 12
Enter rotations: 2
After left rotation: 48

ব্যাখ্যা: ১২ = 00001100 (৮-বিট ভিউ)। ২বার লেফট রোটেট → 00110000 = ৪৮।

প্রোগ্রাম ২: রাইট রোটেশন

#include <stdio.h>
#include <stdlib.h>

int main() {
    int num, rotate;
    int size = sizeof(int) * 8;

    printf("Enter number: ");
    scanf("%d", &num);
    printf("Enter rotations: ");
    scanf("%d", &rotate);

    rotate %= size;

    while (rotate--) {
        int lsb = num & 1;
        num = (num >> 1) | (lsb << (size - 1));
    }

    printf("After right rotation: %d\n", num);
    return 0;
}

আউটপুট

Enter number: 18
Enter rotations: 2
After right rotation: 4

ব্যাখ্যা: ১৮ = 00010010। ২বার রাইট রোটেট → 00000100 = ৪।

জেনেরিক রোটেশন ফাংশন (রিয়ূজেবল)

#include <stdint.h>

uint32_t rotl32(uint32_t x, int n) {
    n %= 32;
    return (x << n) | (x >> (32 - n));
}

uint32_t rotr32(uint32_t x, int n) {
    n %= 32;
    return (x >> n) | (x << (32 - n));
}

ব্যবহার ক্ষেত্র

  • ক্রিপ্টোগ্রাফি (AES, SHA এ রোটেশন ব্যবহার হয়)
  • হ্যাশ ফাংশন
  • বিট ম্যানিপুলেশন ট্রিকস
  • সার্কুলার বাফার ইমপ্লিমেন্টেশন

নোট

  • সাইনড ইন্টিজারে রাইট শিফট ইমপ্লিমেন্টেশন-ডিফাইনড (আরিথমেটিক vs লজিক্যাল)। আনসাইনড টাইপ (uint32_t) ব্যবহার করুন।
  • rotate %= size দিয়ে রোটেশন সংখ্যা বাউন্ড করতে হয়।
  1. সি/সি++ প্রোগ্রামে ট্রায়্যাঙ্গুলার ম্যাচস্টিক নম্বর বের করা

  2. দেওয়া সংখ্যাটি ফিবোনাচি কিনা চেক করার জাভা প্রোগ্রাম

  3. পাইথন প্রোগ্রাম: কোনো সংখ্যা হ্যাপি নম্বর (Happy Number) কিনা চেক করা

  4. পাইথন প্রোগ্রাম: কোনো সংখ্যা ডিজেরিয়াম নম্বর (Disarium Number) কিনা চেক করা