Last active
July 25, 2024 16:52
-
-
Save jrelo/5640fd1f935ecadedeb50bbfbb92e509 to your computer and use it in GitHub Desktop.
bash numerical conversion and bitwise functions
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Conversion Functions | |
hex2dec() { | |
printf "%d\n" "0x$1" | |
} | |
bin2dec() { | |
echo "$((2#$1))" | |
} | |
dec2bin() { | |
echo "obase=2; $1" | bc | |
} | |
dec2hex() { | |
printf "%x\n" "$1" | |
} | |
bin2hex() { | |
echo "obase=16; ibase=2; $1" | bc | |
} | |
hex2bin() { | |
echo "obase=2; ibase=16; $1" | bc | |
} | |
# Determine input type and convert to decimal | |
input_to_dec() { | |
if [[ $1 == 0x* ]]; then | |
# hex input | |
hex2dec "${1:2}" | |
elif [[ $1 == 0b* ]]; then | |
# binary input | |
bin2dec "${1:2}" | |
else | |
# decimal input | |
echo "$1" | |
fi | |
} | |
# Bitwise operations | |
bit_and() { | |
local a=$(input_to_dec "$1") | |
local b=$(input_to_dec "$2") | |
local result=$((a & b)) | |
echo "decimal: $result" | |
echo "binary: $(dec2bin $result)" | |
echo "hex: 0x$(dec2hex $result)" | |
} | |
bit_or() { | |
local a=$(input_to_dec "$1") | |
local b=$(input_to_dec "$2") | |
local result=$((a | b)) | |
echo "decimal: $result" | |
echo "binary: $(dec2bin $result)" | |
echo "hex: 0x$(dec2hex $result)" | |
} | |
bit_xor() { | |
local a=$(input_to_dec "$1") | |
local b=$(input_to_dec "$2") | |
local result=$((a ^ b)) | |
echo "decimal: $result" | |
echo "binary: $(dec2bin $result)" | |
echo "hex: 0x$(dec2hex $result)" | |
} | |
bit_not() { | |
local a=$(input_to_dec "$1") | |
local result=$((~a)) | |
echo "decimal: $result" | |
echo "binary: $(dec2bin $result)" | |
echo "hex: 0x$(dec2hex $result)" | |
} | |
left_shift() { | |
local a=$(input_to_dec "$1") | |
local b=$(input_to_dec "$2") | |
local result=$((a << b)) | |
echo "decimal: $result" | |
echo "binary: $(dec2bin $result)" | |
echo "hex: 0x$(dec2hex $result)" | |
} | |
right_shift() { | |
local a=$(input_to_dec "$1") | |
local b=$(input_to_dec "$2") | |
local result=$((a >> b)) | |
echo "decimal: $result" | |
echo "binary: $(dec2bin $result)" | |
echo "hex: 0x$(dec2hex $result)" | |
} | |
bitmask() { | |
local value=$(input_to_dec "$1") | |
local bitmask=$(input_to_dec "$2") | |
local result=$((value & bitmask)) | |
echo "decimal: $result" | |
echo "binary: $(dec2bin $result)" | |
echo "hex: 0x$(dec2hex $result)" | |
} | |
set_bit() { | |
local value=$(input_to_dec "$1") | |
local bit_position=$(input_to_dec "$2") | |
local result=$((value | (1 << bit_position))) | |
echo "decimal: $result" | |
echo "binary: $(dec2bin $result)" | |
echo "hex: 0x$(dec2hex $result)" | |
} | |
clear_bit() { | |
local value=$(input_to_dec "$1") | |
local bit_position=$(input_to_dec "$2") | |
local result=$((value & ~(1 << bit_position))) | |
echo "decimal: $result" | |
echo "binary: $(dec2bin $result)" | |
echo "hex: 0x$(dec2hex $result)" | |
} | |
toggle_bit() { | |
local value=$(input_to_dec "$1") | |
local bit_position=$(input_to_dec "$2") | |
local result=$((value ^ (1 << bit_position))) | |
echo "decimal: $result" | |
echo "binary: $(dec2bin $result)" | |
echo "hex: 0x$(dec2hex $result)" | |
} | |
check_bit() { | |
local value=$(input_to_dec "$1") | |
local bit_position=$(input_to_dec "$2") | |
local result=$(( (value >> bit_position) & 1 )) | |
if [ $result -eq 1 ]; then | |
echo "bit $bit_position is set (1)" | |
else | |
echo "bit $bit_position is not set (0)" | |
fi | |
} | |
# Networking-specific Functions | |
ip_to_bin() { | |
local IFS=. | |
read -r i1 i2 i3 i4 <<< "$1" | |
printf "%08d%08d%08d%08d\n" "$(bc <<< "obase=2;$i1")" "$(bc <<< "obase=2;$i2")" "$(bc <<< "obase=2;$i3")" "$(bc <<< "obase=2;$i4")" | |
} | |
bin_to_ip() { | |
local bin="$1" | |
echo "$((2#${bin:0:8}))"."$((2#${bin:8:8}))"."$((2#${bin:16:8}))"."$((2#${bin:24:8}))" | |
} | |
bitwise_and() { | |
local bin1="$1" | |
local bin2="$2" | |
local result="" | |
for ((i = 0; i < ${#bin1}; i++)); do | |
result+=$(( ${bin1:i:1} & ${bin2:i:1} )) | |
done | |
echo "$result" | |
} | |
subnet_mask_bin() { | |
local cidr="$1" | |
local mask="" | |
for ((i = 0; i < 32; i++)); do | |
if [ "$i" -lt "$cidr" ]; then | |
mask+="1" | |
else | |
mask+="0" | |
fi | |
done | |
echo "$mask" | |
} | |
network_address() { | |
local ip_bin | |
local mask_bin | |
ip_bin=$(ip_to_bin "$1") | |
mask_bin=$(subnet_mask_bin "$2") | |
bin_to_ip "$(bitwise_and "$ip_bin" "$mask_bin")" | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment