Skip to content

Instantly share code, notes, and snippets.

@jrelo
Last active July 25, 2024 16:52
Show Gist options
  • Save jrelo/5640fd1f935ecadedeb50bbfbb92e509 to your computer and use it in GitHub Desktop.
Save jrelo/5640fd1f935ecadedeb50bbfbb92e509 to your computer and use it in GitHub Desktop.
bash numerical conversion and bitwise functions
#!/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