PHP Operators পর্ব -৫ : PHP Bitwise Operators

এই পর্বে আপনি জানতে পারবেন :

PHP তে Bitwise Operators কি?

PHP অথবা যেকোনো Programming Language এ যেইসব symbol বা চিহ্ন কম্পিউটারের binary পর্যায়ে এক বা একাধিক Integer Number এর মধ্যে নির্দিষ্ট বিট মূল্যায়ন,ম্যানিপুলেশন এবং decision বা সিদ্ধান্ত মূলক কাজ করার জন্য ব্যবহার করা হয়, PHP অথবা যেকোনো Programming Language এর পরিভাষায় এ গুলোকে বলা হয় Bitwise Operators. Bitwise Operator কি তা ভালোভাবে বোঝার জন্য আপনাকে Binary Number কি সেটি বুঝে আসতে হবে। Binary Number সহ অন্যান্য number system ভালো ভাবে বুঝার জন্য নিচের article টি দেখুন।।

PHP তে Bitwise Operators কয়টি? এবং কি কি ?

PHP তে Bitwise Operator ৬ টি। নিচের টেবিল এ প্রত্যেকটি Bitwise Operators সম্পর্কে সংক্ষেপে আলোচনা করা হলো:

Bitwise Operators Operator নাম উদাহরণ ফলাফল (Result)
& And echo $a & $b; সেই Binary Bit গুলিই আসবে যেগুলো $a এবং $b variable দুটোতেই Binary Value Set বা 1
| Or $a | $b সেই Binary Bit গুলিই আসবে যেগুলো $a এবং $b variable দুটোর মধ্যে যেকোনো একটি Set বা 1
^ Xor $a ^ $b সেই Binary Bit গুলিই আসবে যেগুলো $a এবং $b variable দুটোর মধ্যে যেকোনো একটি Set বা 1 কিন্তু দুটিই SET হওয়া যাবেনা।
~ Not ~$a যা আছে তার বিপরীত আসবে। অর্থাৎ : যদি $a এর Binary Bit 0 থাকে , তাহলে Output আসবে 1 . একই ভাবে $a এর Binary Bit 1 থাকে, Output আসবে 0.
<< Left Shift $a<<$b $a এর Binary Bit গুলো $b এর সমসংখ্যক Bit বামে shift হবে।
>> Right Shift $a>>$b $a এর Binary Bit গুলো $b এর সমসংখ্যক Bit ডানে shift হবে।

https://blog.w3programmers.com/php-course/

PHP তে Bitwise And (&) Operator কিভাবে কাজ করে?

php bitwise and

Bitwise And Operator এ সেই Binary Bit গুলিই আসবে যেগুলো $x এবং $y variable দুটোতেই Binary Value Set বা 1

নীচের table দুটি থেকে আমরা বুঝতে পারবো Bitwise AND (&) কীভাবে কাজ করে।

Table 1:

Expression1 Expression2 Result
False False False
False True False
True False False
True True True

Table 2:

Bit in Expression1 Bit in Expression2 Result
0 0 0
0 1 0
1 0 0
1 1 1

Bitwise And (&) কিভাবে কাজ করে তা বুঝার জন্য নিচের উদাহরণ দেখে নেয়া যাক :

<?php
$x=7;
$y=5;
echo $x & $y; //Result: 5
?>

এই উদাহরণ আরেকটু ভালো ভাবে বুঝার জন্য নিচের টেবিল দেখুন :

1 Byte ( 8 bits )
Place Value 128 64 32 16 8 4 2 1    
$x 0 0 0 0 0 1 1 1 = 7
$y 0 0 0 1 0 1 0 1 = 5
Result: 1 0 1 = 5

ব্যাখ্যা: উপরের টেবিল এ আমরা দেখতে পাই, $x এবং $y variable এর প্রথম এবং চতুর্থ Bit দুইটারই Set সংজ্ঞা অনুযায়ী যার AND করলে হয় 101. আর 101 এর ডেসিমাল ভ্যালু হচ্ছে 1*22+0*21+1*20=4+0+1=5

PHP তে Bitwise Or (|) Operator কিভাবে কাজ করে?

PHP Bitwise OR

Bitwise Or Operator এ সেই Binary Bit গুলিই আসবে যেগুলো $x এবং $y variable দুটোর মধ্যে যেকোনো একটি Set বা 1


নীচের table দুটি থেকে আমরা বুঝতে পারবো Bitwise OR (|) কীভাবে কাজ করে।

Table 1:

Expression1 Expression2 Result
False False False
False True True
True False True
True True True

Table 2:

Bit in Expression1 Bit in Expression2 Result
0 0 0
0 1 1
1 0 1
1 1 1

Bitwise OR (|) কিভাবে কাজ করে তা বুঝার জন্য নিচের উদাহরণ দেখে নেয়া যাক :

<?php
$x=7;
$y=5;
echo $x | $y; //Result: 7
?>

এই উদাহরণ আরেকটু ভালো ভাবে বুঝার জন্য নিচের টেবিল দেখুন :

1 Byte ( 8 bits )
Place Value 128 64 32 16 8 4 2 1    
$x 0 0 0 0 0 1 1 1 = 7
$y 0 0 0 1 0 1 0 1 = 5
Result: 1 1 1 = 7

ব্যাখ্যা: উপরের টেবিল এ আমরা দেখতে পাই, $x variable এর প্রথম ,দ্বিতীয় এবং চতুর্থ Bit তিনটিই Set সংজ্ঞা অনুযায়ী যার OR করলে হয় 111. আর 111 এর ডেসিমাল ভ্যালু হচ্ছে 1*22+1*21+1*20=4+2+1=5

https://blog.w3programmers.com/php-course/

PHP তে Bitwise Xor (^) Operator কিভাবে কাজ করে?

bitwise-Xor

Bitwise Xor Operator এ সেই Binary Bit গুলিই আসবে যেগুলো $a এবং $b variable দুটোর মধ্যে যেকোনো একটি Set বা 1 কিন্তু দুটিই SET বা UNSET হওয়া যাবেনা। নীচের table দুটি থেকে আমরা বুঝতে পারবো Bitwise XOR কীভাবে কাজ করে।

Table 1:

Expression1 Expression2 Result
False False False
False True True
True False True
True True False

Table 2:

Bit in Expression1 Bit in Expression2 Result
0 0 0
0 1 1
1 0 1
1 1 0

Bitwise Or (^) কিভাবে কাজ করে তা বুঝার জন্য নিচের উদাহরণ দেখে নেয়া যাক :

<?php
$x=7;
$y=5;
echo $x ^ $y; //Result: 2
?>

আরেকটু ভালো ভাবে বুঝার জন্য নিচের টেবিল দেখুন :

1 Byte ( 8 bits )
Place Value 128 64 32 16 8 4 2 1    
$x 0 0 0 0 0 1 1 1 = 7
$y 0 0 0 1 0 1 0 1 = 5
Result: 0 1 0 = 2

ব্যাখ্যা: উপরের টেবিল এ আমরা দেখতে পাই, $x এবং $y variable এর প্রথম এবং চতুর্থ Bit দুইটারই Set একমাত্র দ্বিতীয় Bit ই একটি আরেকটির বিপরীত সংজ্ঞা অনুযায়ী যার Xor করলে হয় 010. আর 010 এর ডেসিমাল ভ্যালু হচ্ছে 0*22+1*21+0*20=0+1+0=2

https://blog.w3programmers.com/php-course/

PHP তে Bitwise Not (~) Operator কিভাবে কাজ করে?

Bitwise Not মানে যা আছে তার বিপরীত আসবে। অর্থাৎ : যদি $a এর Binary Bit 0 থাকে , তাহলে Output আসবে 1 . একই ভাবে $a এর Binary Bit 1 থাকে, Output আসবে 0.

Bitwise OR (|) এবং Bitwise AND (&)এর বাস্তব প্রয়োগ #১:

আসুন একটি ওয়েব অ্যাপ্লিকেশনে user permissions সম্পর্কিত একটি real-world example বিবেচনা করি।

কল্পনা করুন আপনার এমন একটি সিস্টেম আছে যেখানে প্রতিটি ইউজারের আপনার অ্যাপ্লিকেশনের বিভিন্ন অংশ অ্যাক্সেস করার জন্য নির্দিষ্ট পারমিশন রয়েছে। আপনি bitwise operations ব্যবহার করে এই পারমিশন গুলি দক্ষতার সাথে সংরক্ষণ করতে চান। এখানে একটি সরলীকৃত উদাহরণ:

<?php
// Define permission constants
define('READ', 1);      // 0001
define('WRITE', 2);     // 0010
define('DELETE', 4);    // 0100
define('ADMIN', 8);     // 1000

// User permissions
$user1Permissions = READ | WRITE;    // 0001 | 0010 = 0011
$user2Permissions = READ | DELETE;   // 0001 | 0100 = 0101
$user3Permissions = ADMIN;           // 1000

// Check if a user has a specific permission
function hasPermission($userPermissions, $permissionToCheck) {
    return ($userPermissions & $permissionToCheck) === $permissionToCheck;
}

// Example usage
if (hasPermission($user1Permissions, WRITE)) {
    echo "User 1 has write permission.";
} else {
    echo "User 1 does not have write permission.";
}

if (hasPermission($user2Permissions, DELETE)) {
    echo "User 2 has delete permission.";
} else {
    echo "User 2 does not have delete permission.";
}

if (hasPermission($user3Permissions, WRITE)) {
    echo "User 3 has write permission.";
} else {
    echo "User 3 does not have write permission.";
}
?>

Output

User 1 has write permission.
User 2 has delete permission.
User 3 does not have write permission.

Bitwise XOR এর বাস্তব প্রয়োগ #১:

একটি simple message কে এনক্রিপ্ট এবং ডিক্রিপ্ট করার জন্য পিএইচপি-তে XOR (^) অপারেটর ব্যবহার করার একটি real-world example বিবেচনা করা যাক। একটি কী সহ একটি message XOR করা এনক্রিপশনের একটি মৌলিক রূপ।

<?php
function simpleXOREncryption($message, $key) {
    $messageLength = strlen($message);
    $keyLength = strlen($key);

    // Repeat the key to match the length of the message
    $extendedKey = str_repeat($key, ceil($messageLength / $keyLength));

    $encryptedMessage = '';

    // XOR each character of the message with the corresponding character in the key
    for ($i = 0; $i < $messageLength; $i++) {
        $encryptedMessage .= $message[$i] ^ $extendedKey[$i];
    }

    return $encryptedMessage;
}

function simpleXORDecryption($encryptedMessage, $key) {
    return simpleXOREncryption($encryptedMessage, $key); // XORing twice gives back the original message
}

// Example usage
$message = "Hello, World!";
$key = "secretkey";

// Encrypt the message
$encryptedMessage = simpleXOREncryption($message, $key);
echo "Encrypted Message: $encryptedMessage\n";

// Decrypt the message
$decryptedMessage = simpleXORDecryption($encryptedMessage, $key);
echo "Decrypted Message: $decryptedMessage\n";
?>

Bitwise Not (~) কিভাবে কাজ করে তা বুঝার জন্য নিচের উদাহরণ দেখে নেয়া যাক :

<?php
$x=7;
$y=3;
echo $x & ~$y; //Result=4
?>

উদাহরণটি আরেকটু ভালো ভাবে বুঝার জন্য নিচের টেবিল দেখুন :

1 Byte ( 8 bits )
Place Value 128 64 32 16 8 4 2 1    
$x 1 1 1 = 7
$y 0 1 1 = 3
~$y 1 0 0 = 4
Result: 1 0 0 = 4

Bitwise NOT (~)এর বাস্তব প্রয়োগ #১:

<?php
// Define permission constants
define('READ', 1);      // 0001
define('WRITE', 2);     // 0010
define('DELETE', 4);    // 0100
define('ADMIN', 8);     // 1000

// Define user roles
$userRoles = READ | WRITE | ADMIN; // User has READ, WRITE, and ADMIN roles (0001 | 0010 | 1000 = 1011)

// Display current user roles and permissions
echo "User Roles: $userRoles\n";
echo "User Permissions: " . ($userRoles & (READ | WRITE | DELETE | ADMIN)) . "\n";

// Revoke DELETE permission using bitwise NOT (~)
$revokedPermission = DELETE;
$userRoles &= ~$revokedPermission;

// Display updated user roles and permissions
echo "Revoked Permission: $revokedPermission\n";
echo "Updated User Roles: $userRoles\n";
echo "Updated User Permissions: " . ($userRoles & (READ | WRITE | DELETE | ADMIN)) . "\n";
?>

উপরোক্ত উদাহরণে আমরা bitwise NOT (~) operator ব্যবহার করি এর বিট প্যাটার্ন উল্টে ডিলিট অনুমতি প্রত্যাহার করি ।

PHP তে Bitwise Left Shift(<<) Operator কি? এবং কিভাবে কাজ করে?

যখন Binary Bit গুলো নির্দিষ্ট সংখ্যক ধাপ বামে স্থানান্তর হয়, PHP এর পরিভাষায় একে বলা হয় Left Shift. Left Shift বের করার সহজ পদ্ধতি হচ্ছে , যেই সংখ্যার সাথে যত ধাপ left shift করবেন ততগুলো ২ একটি আরেকটির সাথে গুন করতে হবে। এবং ঐ গুণফলের সাথে মূল সংখ্যার (অর্থাৎ যাকে Left Shift করবেন তাকে) গুন করতে হবে। আরেকটু সহজ ভাবে বুঝার জন্য নিচের উদাহরণটি টি দেখুন :

<?php
echo 8<<2; //Result:32
echo "<br>";
echo 8<<4 //Result: 128
?>

এখানে 8<<2 মানে বুঝায় 8*22 = 8*2*2=32 একই ভাবে 8<<4 মানে বুঝায় 8*24 = 8*2*2*2*2=128

PHP তে Right Shift(>>) Operator কি? এবং কিভাবে কাজ করে?

যখন Binary Bit গুলো নির্দিষ্ট সংখ্যক ধাপ ডানে স্থানান্তর হয়, PHP এর পরিভাষায় একে বলা হয় Right Shift. Right Shift বের করার সহজ পদ্ধতি হচ্ছে , যেই সংখ্যার সাথে যত ধাপ Right shift করবেন ততগুলো ২ একটি আরেকটির সাথে গুন করতে হবে। এবং ঐ গুণফলের সাথে মূল সংখ্যার (অর্থাৎ যাকে Right Shift করবেন তাকে) ভাগ করতে হবে। আরেকটু সহজ ভাবে বুঝার জন্য নিচের উদাহরণটি টি দেখুন :

<?php
echo 8 & 2; //Result:2
echo "<br>";
echo 16 & 4 //Result:1
?>

এখানে 8>>2 মানে বুঝায় 8/22 = 8/2*2=2 একই ভাবে 16>>4 মানে বুঝায় 16/24 = 16/2*2*2*2=1

Bitwise Left Shift(<<) এবং Bitwise Right Shift(>>) এর বাস্তব প্রয়োগ #১:

bitwise left shift (<<) এবং bitwise right shift (>>) ব্যবহার করে একটি বাস্তব উদাহরণ দেখা যাক। এই উদাহরণে, আমরা একটি simple user permissions system তৈরি করব যেখানে permissions গুলি একটি single integer এ সংরক্ষণ করা হয় এবং এই permissions গুলিকে ম্যানিপুলেট করতে bitwise shifts ব্যবহার করা হয়।

<?php
// Define permission constants
define('READ', 1);      // 0001
define('WRITE', 2);     // 0010
define('DELETE', 4);    // 0100
define('ADMIN', 8);     // 1000

// Initial user permissions
$userPermissions = READ; // User has READ permission (0001)

// Display initial user permissions
echo "Initial User Permissions: $userPermissions\n";

// Use bitwise left shift to add WRITE permission
$userPermissions = $userPermissions | (WRITE << 1); // 0001 | (0010 << 1) = 0001 | 0100 = 0101

// Display updated user permissions
echo "User Permissions After Adding WRITE: $userPermissions\n";

// Simulate permissions expiration using bitwise right shift
$expirationTime = 2; // Assume permissions expire after 2 time units
$userPermissions = $userPermissions >> $expirationTime; // Shift the bits to the right, simulating permission expiration

// Display final user permissions after expiration
echo "Final User Permissions After Expiration: $userPermissions\n";
?>

আমি মাসুদ আলম, বাংলাদেশের ৩৬ তম Zend Certified Engineer । ২০০৯ সালে কম্পিউটার সাইন্স থেকে বেচেলর ডিগ্রী অর্জন করি। দীর্ঘ ১৫ বছর আমি Winux Soft, SSL Wireless, IBCS-PRIMAX, Max Group, Canadian International Development Agency (CIDA), Care Bangladesh, World Vision, Hellen Keller, Amarbebsha Ltd সহ বিভিন্ন দেশি বিদেশী কোম্পানিতে ডেটা সাইন্স, মেশিন লার্নিং, বিগ ডেটা, ওয়েব ডেভেলপমেন্ট এবং সফটওয়্যার ডেভেলপমেন্ট এর উপর বিভিন্ন লিডিং পজিশন এ চাকরি এবং প্রজেক্ট লিড করি। এছাড়াও বাংলাদেশের ১৮৫ জন জেন্ড সার্টিফাইড ইঞ্জিনিয়ার এর মধ্যে ১২০ এরও অধিক ছাত্র আমার হাতে জেন্ড সার্টিফাইড ইঞ্জিনিয়ার হয়েছেন। বর্তমানে w3programmers ট্রেনিং ইনস্টিটিউট এ PHP এর উপর Professional এবং Advance Zend Certified PHP -8.2 Engineering, Laravel Mastering Course with ReactJS, Python Beginning To Advance with Blockchain, Machine Learning and Data Science, Professional WordPress Plugin Development Beginning to Advance কোর্স করাই। আর অবসর সময়ে w3programmers.com এ ওয়েব টেকনোলজি নিয়ে লেখালেখি করি।

Leave a Reply