diff --git a/Assignment5/.bitarr.c.un~ b/Assignment5/.bitarr.c.un~
new file mode 100644
index 0000000..ab88154
Binary files /dev/null and b/Assignment5/.bitarr.c.un~ differ
diff --git a/Assignment5/.bitarr.h.un~ b/Assignment5/.bitarr.h.un~
new file mode 100644
index 0000000..257416f
Binary files /dev/null and b/Assignment5/.bitarr.h.un~ differ
diff --git a/Assignment5/.bitmap.c.un~ b/Assignment5/.bitmap.c.un~
new file mode 100644
index 0000000..e7c64d0
Binary files /dev/null and b/Assignment5/.bitmap.c.un~ differ
diff --git a/Assignment5/.bitmap.h.un~ b/Assignment5/.bitmap.h.un~
new file mode 100644
index 0000000..56bf6ce
Binary files /dev/null and b/Assignment5/.bitmap.h.un~ differ
diff --git a/Assignment5/README.md b/Assignment5/README.md
new file mode 100644
index 0000000..19001ac
--- /dev/null
+++ b/Assignment5/README.md
@@ -0,0 +1,2 @@
+# bitops_in_c
+bitops_in_c
diff --git a/Assignment5/bitarr.c b/Assignment5/bitarr.c
new file mode 100644
index 0000000..9b9af6b
--- /dev/null
+++ b/Assignment5/bitarr.c
@@ -0,0 +1,188 @@
+/*
+ * =====================================================================================
+ *
+ * Filename: bitarr.c
+ *
+ * Description:
+ *
+ * Version: 1.0
+ * Created: Sunday 04 March 2018 06:23:30 IST
+ * Revision: 1.0
+ * Compiler: gcc
+ *
+ * Author: Er. Abhishek Sagar, Networking Developer (AS), sachinites@gmail.com
+ * Company: Brocade Communications(Jul 2012- Mar 2016), Current : Juniper Networks(Apr 2017 - Present)
+ *
+ * This file is part of the SPFComputation distribution (https://github.com/sachinites).
+ * Copyright (c) 2017 Abhishek Sagar.
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ * =====================================================================================
+ */
+
+#include
+#include
+#include
+#include "bitsop.h"
+#include "bitarr.h"
+
+#define CHAR_SIZE 8
+
+void
+init_bit_array(bit_array_t *bitarr, unsigned int n_bits){
+
+ unsigned int n_byte_blocks = n_bits/CHAR_SIZE;
+
+ if(n_bits % CHAR_SIZE)
+ n_byte_blocks++;
+ if(!bitarr->array)
+ bitarr->array = calloc(1, n_byte_blocks);
+ else
+ memset(bitarr->array, 0, n_byte_blocks);
+ bitarr->size = n_bits;
+ bitarr->trail_bits = n_bits % CHAR_SIZE;
+}
+
+void
+set_bit(bit_array_t *bitarr, unsigned int index){
+
+ if(index >= bitarr->size){
+ printf("%u is out of array bounds [%u,%u]\n",
+ index, 0, bitarr->size -1);
+ return;
+ }
+
+ unsigned byte_block = 0,
+ residual_bit = 0;
+
+ byte_block = index / CHAR_SIZE;
+ residual_bit = index % CHAR_SIZE;
+
+#if 0
+ assert(bitarr->size/CHAR_SIZE == byte_block &&
+ bitarr->trail_bits >= residual_bit);
+#endif
+
+ char *ptr = bitarr->array + byte_block;
+ SET_BIT((*ptr), (CHAR_SIZE - residual_bit));
+}
+
+void
+unset_bit(bit_array_t *bitarr, unsigned int index){
+
+ if(index >= bitarr->size){
+ printf("%u is out of array bounds [%u,%u]\n",
+ index, 0, bitarr->size -1);
+ return;
+ }
+
+ unsigned byte_block = 0,
+ residual_bit = 0;
+
+ byte_block = index / CHAR_SIZE;
+ residual_bit = index % CHAR_SIZE;
+
+#if 0
+ assert(bitarr->size/CHAR_SIZE == byte_block &&
+ bitarr->trail_bits >= residual_bit);
+#endif
+
+ char *ptr = bitarr->array + byte_block;
+ UNSET_BIT((*ptr), (CHAR_SIZE - residual_bit));
+}
+
+bool
+is_bit_set(bit_array_t *bitarr, unsigned int index){
+
+
+ if(index >= bitarr->size){
+ printf("%u is out of array bounds [%u,%u]\n",
+ index, 0, bitarr->size -1);
+ return 0;
+ }
+
+ unsigned byte_block = 0,
+ residual_bit = 0;
+
+ byte_block = index / CHAR_SIZE;
+ residual_bit = index % CHAR_SIZE;
+
+#if 0
+ assert(bitarr->size/CHAR_SIZE == byte_block &&
+ bitarr->trail_bits >= residual_bit);
+#endif
+ char *ptr = bitarr->array + byte_block;
+ return (IS_BIT_SET((*ptr), (CHAR_SIZE - residual_bit)));
+}
+
+unsigned int
+get_next_available_bit(bit_array_t *bitarr){
+
+ unsigned int i = 0;
+ for(; i < bitarr->size; i++){
+ if(is_bit_set(bitarr, i))
+ continue;
+ return i;
+ }
+ return 0xFFFFFFFF;
+}
+
+void
+print_bit_array(bit_array_t *bitarr){
+
+ unsigned int i = 0, index = 0,
+ byte_blocks = 0,
+ residual_bits = 0;
+
+ int j = 0;
+
+ byte_blocks = bitarr->size / CHAR_SIZE;
+ residual_bits = bitarr->size % CHAR_SIZE;
+ //assert(bitarr->trail_bits >= residual_bit);
+ char *ptr = bitarr->array;
+ char byte = 0;
+
+ for( ; i < byte_blocks; i++){
+ byte = *(ptr+i);
+ for(j = 7; j >= 0; j--, index++){
+ printf("[%u] : %c\n", index, IS_BIT_SET(byte, j) ? '1' : '0');
+ }
+ }
+
+ if(!residual_bits)
+ return;
+
+ byte = *(ptr+i);
+ for(j = 7; j >= CHAR_SIZE - residual_bits; j--, index++){
+ printf("[%u] : %c\n", index, IS_BIT_SET(byte, j) ? '1' : '0');
+ }
+}
+
+
+#if 0
+int
+main(int argc, char **argv){
+
+ bit_array_t *arr = calloc(1, sizeof(bit_array_t));
+ init_bit_array(arr, 15);
+ set_bit(arr, 11);
+ set_bit(arr, 21);
+ set_bit(arr, 30);
+ set_bit(arr, 3);
+ set_bit(arr, 33);
+ print_bit_array(arr);
+ unset_bit(arr, 11);
+ print_bit_array(arr);
+ return 0;
+}
+#endif
diff --git a/Assignment5/bitarr.c~ b/Assignment5/bitarr.c~
new file mode 100644
index 0000000..e35591c
--- /dev/null
+++ b/Assignment5/bitarr.c~
@@ -0,0 +1,188 @@
+/*
+ * =====================================================================================
+ *
+ * Filename: bitarr.c
+ *
+ * Description:
+ *
+ * Version: 1.0
+ * Created: Sunday 04 March 2018 06:23:30 IST
+ * Revision: 1.0
+ * Compiler: gcc
+ *
+ * Author: Er. Abhishek Sagar, Networking Developer (AS), sachinites@gmail.com
+ * Company: Brocade Communications(Jul 2012- Mar 2016), Current : Juniper Networks(Apr 2017 - Present)
+ *
+ * This file is part of the SPFComputation distribution (https://github.com/sachinites).
+ * Copyright (c) 2017 Abhishek Sagar.
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ * =====================================================================================
+ */
+
+#include
+#include
+#include
+#include "bitsop.h"
+#include "bitarr.h"
+
+#define CHAR_SIZE 8
+
+void
+init_bit_array(bit_array_t *bitarr, unsigned int n_bits){
+
+ unsigned int n_byte_blocks = n_bits/CHAR_SIZE;
+
+ if(n_bits % CHAR_SIZE)
+ n_byte_blocks++;
+ if(!bitarr->array)
+ bitarr->array = calloc(1, n_byte_blocks);
+ else
+ memset(bitarr->array, 0, n_byte_blocks);
+ bitarr->size = n_bits;
+ bitarr->trail_bits = n_bits % CHAR_SIZE;
+}
+
+void
+set_bit(bit_array_t *bitarr, unsigned int index){
+
+ if(index >= bitarr->size){
+ printf("%u is out of array bounds [%u,%u]\n",
+ index, 0, bitarr->size -1);
+ return;
+ }
+
+ unsigned byte_block = 0,
+ residual_bit = 0;
+
+ byte_block = index / CHAR_SIZE;
+ residual_bit = index % CHAR_SIZE;
+
+#if 0
+ assert(bitarr->size/CHAR_SIZE == byte_block &&
+ bitarr->trail_bits >= residual_bit);
+#endif
+
+ char *ptr = bitarr->array + byte_block;
+ SET_BIT((*ptr), (CHAR_SIZE - residual_bit));
+}
+
+void
+unset_bit(bit_array_t *bitarr, unsigned int index){
+
+ if(index >= bitarr->size){
+ printf("%u is out of array bounds [%u,%u]\n",
+ index, 0, bitarr->size -1);
+ return;
+ }
+
+ unsigned byte_block = 0,
+ residual_bit = 0;
+
+ byte_block = index / CHAR_SIZE;
+ residual_bit = index % CHAR_SIZE;
+
+#if 0
+ assert(bitarr->size/CHAR_SIZE == byte_block &&
+ bitarr->trail_bits >= residual_bit);
+#endif
+
+ char *ptr = bitarr->array + byte_block;
+ UNSET_BIT((*ptr), (CHAR_SIZE - residual_bit));
+}
+
+char
+is_bit_set(bit_array_t *bitarr, unsigned int index){
+
+
+ if(index >= bitarr->size){
+ printf("%u is out of array bounds [%u,%u]\n",
+ index, 0, bitarr->size -1);
+ return 0;
+ }
+
+ unsigned byte_block = 0,
+ residual_bit = 0;
+
+ byte_block = index / CHAR_SIZE;
+ residual_bit = index % CHAR_SIZE;
+
+#if 0
+ assert(bitarr->size/CHAR_SIZE == byte_block &&
+ bitarr->trail_bits >= residual_bit);
+#endif
+ char *ptr = bitarr->array + byte_block;
+ return (char)(IS_BIT_SET((*ptr), (CHAR_SIZE - residual_bit)));
+}
+
+unsigned int
+get_next_available_bit(bit_array_t *bitarr){
+
+ unsigned int i = 0;
+ for(; i < bitarr->size; i++){
+ if(is_bit_set(bitarr, i))
+ continue;
+ return i;
+ }
+ return 0xFFFFFFFF;
+}
+
+void
+print_bit_array(bit_array_t *bitarr){
+
+ unsigned int i = 0, index = 0,
+ byte_blocks = 0,
+ residual_bits = 0;
+
+ int j = 0;
+
+ byte_blocks = bitarr->size / CHAR_SIZE;
+ residual_bits = bitarr->size % CHAR_SIZE;
+ //assert(bitarr->trail_bits >= residual_bit);
+ char *ptr = bitarr->array;
+ char byte = 0;
+
+ for( ; i < byte_blocks; i++){
+ byte = *(ptr+i);
+ for(j = 7; j >= 0; j--, index++){
+ printf("[%u] : %c\n", index, IS_BIT_SET(byte, j) ? '1' : '0');
+ }
+ }
+
+ if(!residual_bits)
+ return;
+
+ byte = *(ptr+i);
+ for(j = 7; j >= CHAR_SIZE - residual_bits; j--, index++){
+ printf("[%u] : %c\n", index, IS_BIT_SET(byte, j) ? '1' : '0');
+ }
+}
+
+
+#if 0
+int
+main(int argc, char **argv){
+
+ bit_array_t *arr = calloc(1, sizeof(bit_array_t));
+ init_bit_array(arr, 15);
+ set_bit(arr, 11);
+ set_bit(arr, 21);
+ set_bit(arr, 30);
+ set_bit(arr, 3);
+ set_bit(arr, 33);
+ print_bit_array(arr);
+ unset_bit(arr, 11);
+ print_bit_array(arr);
+ return 0;
+}
+#endif
diff --git a/Assignment5/bitarr.h b/Assignment5/bitarr.h
new file mode 100644
index 0000000..af412a8
--- /dev/null
+++ b/Assignment5/bitarr.h
@@ -0,0 +1,59 @@
+/*
+ * =====================================================================================
+ *
+ * Filename: bitarr.h
+ *
+ * Description: Interface to Bit Array
+ *
+ * Version: 1.0
+ * Created: Sunday 04 March 2018 06:20:07 IST
+ * Revision: 1.0
+ * Compiler: gcc
+ *
+ * Author: Er. Abhishek Sagar, Networking Developer (AS), sachinites@gmail.com
+ * Company: Brocade Communications(Jul 2012- Mar 2016), Current : Juniper Networks(Apr 2017 - Present)
+ *
+ * This file is part of the BIT Array distribution (https://github.com/sachinites).
+ * Copyright (c) 2017 Abhishek Sagar.
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ * =====================================================================================
+ */
+
+#ifndef __BIT_ARRAY__
+#define __BIT_ARRAY__
+
+#include
+
+typedef struct _bit_array{
+ unsigned int size;
+ char *array;
+ char trail_bits;
+} bit_array_t;
+
+void
+init_bit_array(bit_array_t *bitarr, unsigned int size);
+
+void
+set_bit(bit_array_t *bitarr, unsigned int index);
+
+void
+unset_bit(bit_array_t *bitarr, unsigned int index);
+
+bool
+is_bit_set(bit_array_t *bitarr, unsigned int index);
+
+unsigned int
+get_next_available_bit(bit_array_t *bitarr);
+
+#endif /* __BIT_ARRAY__ */
diff --git a/Assignment5/bitarr.h~ b/Assignment5/bitarr.h~
new file mode 100644
index 0000000..1fed46d
--- /dev/null
+++ b/Assignment5/bitarr.h~
@@ -0,0 +1,57 @@
+/*
+ * =====================================================================================
+ *
+ * Filename: bitarr.h
+ *
+ * Description: Interface to Bit Array
+ *
+ * Version: 1.0
+ * Created: Sunday 04 March 2018 06:20:07 IST
+ * Revision: 1.0
+ * Compiler: gcc
+ *
+ * Author: Er. Abhishek Sagar, Networking Developer (AS), sachinites@gmail.com
+ * Company: Brocade Communications(Jul 2012- Mar 2016), Current : Juniper Networks(Apr 2017 - Present)
+ *
+ * This file is part of the BIT Array distribution (https://github.com/sachinites).
+ * Copyright (c) 2017 Abhishek Sagar.
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, version 3.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ * =====================================================================================
+ */
+
+#ifndef __BIT_ARRAY__
+#define __BIT_ARRAY__
+
+typedef struct _bit_array{
+ unsigned int size;
+ char *array;
+ char trail_bits;
+} bit_array_t;
+
+void
+init_bit_array(bit_array_t *bitarr, unsigned int size);
+
+void
+set_bit(bit_array_t *bitarr, unsigned int index);
+
+void
+unset_bit(bit_array_t *bitarr, unsigned int index);
+
+char
+is_bit_set(bit_array_t *bitarr, unsigned int index);
+
+unsigned int
+get_next_available_bit(bit_array_t *bitarr);
+
+#endif /* __BIT_ARRAY__ */
diff --git a/Assignment5/bitmap.c b/Assignment5/bitmap.c
new file mode 100644
index 0000000..969db4c
--- /dev/null
+++ b/Assignment5/bitmap.c
@@ -0,0 +1,100 @@
+/*
+ * =====================================================================================
+ *
+ * Filename: bitmap.c
+ *
+ * Description:
+ *
+ * Version: 1.0
+ * Created: 23/02/24 08:02:40 PM IST
+ * Revision: none
+ * Compiler: gcc
+ *
+ * Author: YOUR NAME (),
+ * Organization:
+ *
+ * =====================================================================================
+ */
+
+#include "bitmap.h"
+
+#ifndef CHAR_SIZE
+#define CHAR_SIZE 8
+#endif
+
+bool
+bitmap_is_full(bit_array_t *bitmap){
+
+ unsigned int sz = bitmap->size;
+ unsigned int byte_block = sz/CHAR_SIZE;
+ unsigned int residual_block = sz%CHAR_SIZE;
+
+ char *ptr = NULL;
+ for(int block_num = 0 ; block_num < byte_block ; block_num ){
+
+ ptr = bitarr->array+block_num;
+
+ if( block_num == byte_block - 1 ){
+ if( (*ptr) != ~((1<<(CHAR_SIZE - residual_block))-1) ){
+ return false;
+ }
+ continue;
+ }
+
+ if( (*ptr) != (1<<8)-1 ){
+ return false;
+ }
+ }
+
+ return true;
+
+}
+
+bool
+bitmap_pattern_match( bit_array_t *bitmap, char *binary_string,int n_bits,int *i){
+
+ if( n_bits > 32){
+ printf("Number of bits is over the limit(32-bits).\n");
+ exit(EXIT_FAILURE);
+ }
+
+ unsigned sz = bitmap->size;
+
+ unsigned bitmap_num = 0;
+
+ for(int idx = 0 ; idx < sz ; i++ ){
+ if( is_bit_set(bitmap,idx) ){
+ bitmap_num |= (1<size;
+ unsigned int byte_block = sz/CHAR_SIZE;
+ unsigned int residual_block = sz%CHAR_SIZE;
+
+ char *ptr = NULL;
+ for(int block_num = 0 ; block_num < byte_block ; block_num ){
+
+ ptr = bitarr->array+block_num;
+
+ if( block_num == byte_block - 1 ){
+ if( (*ptr) != ~((1<<(CHAR_SIZE - residual_block))-1) ){
+ return false;
+ }
+ continue;
+ }
+
+ if( (*ptr) != (1<<8)-1 ){
+ return false;
+ }
+ }
+
+ return true;
+
+}
+
+bool
+bitmap_pattern_match( bit_array_t *bitmap, char *binary_string,int n_bits,int *i){
+
+}
diff --git a/Assignment5/bitmap.h b/Assignment5/bitmap.h
new file mode 100644
index 0000000..3b09e46
--- /dev/null
+++ b/Assignment5/bitmap.h
@@ -0,0 +1,55 @@
+/*
+ * =====================================================================================
+ *
+ * Filename: bitmap.h
+ *
+ * Description:
+ *
+ * Version: 1.0
+ * Created: 23/02/24 07:42:05 PM IST
+ * Revision: none
+ * Compiler: gcc
+ *
+ * Author: YOUR NAME (),
+ * Organization:
+ *
+ * =====================================================================================
+ */
+
+#ifndef __BITMAP_H_
+#define __BITMAP_H_
+
+#ifndef __BIT_ARRAY__
+#include "bitsop.h"
+#endif
+
+#ifndef __BITS__
+#include "bitarr.h"
+#endif
+
+#define ITERATE_BITMAP_BEGIN(bitmap_ptr ,bit_state) \
+{ \
+ char *ptr = bitmap_ptr->array; \
+ unsigned sz = bitmap_ptr->size; \
+ unsigned n_blocks = sz/8; \
+ unsigned residual_bit = sz%8; \
+ for(int byte_block = 0 ; byte_block < n_blocks ; byte_block++ ){ \
+ ptr = ptr + byte_block; \
+ for( int idx = 7 ; idx >= (byte_block == n_blocks-1)?8-residual_bit:0 ; idx-- ){ \
+ if( (*ptr)&(1<
+
+#define ITERATE_BITMAP_END(bitmap_ptr ,bit_state)
+
+bool
+bitmap_is_full(bit_arrya_t *bitmap);
+
+bool
+bitmap_pattern_match(bit_array_t *bitmap,char *binary_string,int n_bits,int *i);
+
+#endif
diff --git a/Assignment5/bitsop.c b/Assignment5/bitsop.c
new file mode 100644
index 0000000..329c91b
--- /dev/null
+++ b/Assignment5/bitsop.c
@@ -0,0 +1,48 @@
+/*
+ * =====================================================================================
+ *
+ * Filename: bitsop.c
+ *
+ * Description:
+ *
+ * Version: 1.0
+ * Created: 22/02/24 09:24:28 AM IST
+ * Revision: none
+ * Compiler: gcc
+ *
+ * Author: YOUR NAME (),
+ * Organization:
+ *
+ * =====================================================================================
+ */
+
+uint8_t
+count_bit_set(uint32_t n){
+ uint8_t bit_cnt = 0;
+
+ for(int i = 0 ; i < 32 ; i++ ){
+ if( n&(1<
+
+#define IS_BIT_SET(n, pos) ((n & (1 << (pos))) != 0)
+#define TOGGLE_BIT(n, pos) (n = n ^ (1 << (pos)))
+#define COMPLEMENT(num) (num = num ^ 0xFFFFFFFF)
+#define UNSET_BIT(n, pos) (n = n & ((1 << pos) ^ 0xFFFFFFFF))
+#define SET_BIT(n, pos) (n = n | 1 << pos)
+
+uint8_t
+count_bit_set(uint32_t n);
+
+#endif
+
diff --git a/Assignment5/solution.c b/Assignment5/solution.c
new file mode 100644
index 0000000..66bada4
--- /dev/null
+++ b/Assignment5/solution.c
@@ -0,0 +1,226 @@
+#include
+#include
+#include
+#include
+#include
+
+/* Visit website : https://csepracticals.wixsite.com/csepracticals
+ * Use following Links to verify the results :
+ * Link 1 : http://www.silisoftware.com/tools/ipconverter.php
+ * Link 2 : http://jodies.de/ipcalc
+ *
+ * Solution to Assignment
+ * Level : Intermediate to Advanced, not for Beginner Programmers
+ *
+ * How to compile and run :
+ * Compile : gcc -g -c solution.c -o solution.o
+ * Link : gcc -g solution.o -o solution -lm
+ * Run : ./solution
+ * */
+
+/*Bit Wise operations
+ *
+ * You must be familiar with Bitwise operations done
+ * in C. Please understand the below Macros
+ * */
+
+/*You must know the concept of Big endian and Little Endian Machines
+ * and what is the purpose of htonl and ntohl - Important*/
+
+/*Standard Functions suchs as inet_pton and inet_ntop have been used to
+ * make life easier. Understand the use of this Function. Google them.*/
+
+
+/*If you dont understand this assignment solution, you need to work on
+ * your C language*/
+
+#define IS_BIT_SET(n, pos) ((n & (1 << (pos))) != 0)
+#define TOGGLE_BIT(n, pos) (n = n ^ (1 << (pos)))
+#define COMPLEMENT(num) (num = num ^ 0xFFFFFFFF)
+#define UNSET_BIT(n, pos) (n = n & ((1 << pos) ^ 0xFFFFFFFF))
+#define SET_BIT(n, pos) (n = n | 1 << pos)
+
+
+#define PREFIX_LEN 15 /*Max length of IP address in A.B.C.D format*/
+#define MAX_MASK_LEN 32 /*Maximum mask value in decimal notation*/
+
+/*For example, if mask = 24 is passed as an argument,
+ * function should return an unsigned integer equivalent to
+ * below bit settings
+ * 11111111 11111111 11111111 00000000
+ * */
+static unsigned int
+get_mask_value_in_integer_format(char mask_value){
+
+ unsigned int mask = 0xFFFFFFFF;
+ char n_trail_bits = MAX_MASK_LEN - mask_value;
+ int i = 0;
+ for(; i < n_trail_bits; i++){
+ UNSET_BIT(mask, i);
+ }
+ return mask;
+}
+
+void
+get_broadcast_address(char *ip_addr,
+ char mask,
+ char *output_buffer){
+
+ unsigned int ip_addr_integer = 0;
+
+ /*Convert ip address from A.B.C.D format to equivalent unsigned integer*/
+ inet_pton(AF_INET, ip_addr, &ip_addr_integer);
+ /* To understand below line, you need to google
+ * Little endian and big endian concept*/
+ ip_addr_integer = htonl(ip_addr_integer);
+
+ unsigned int mask_integer_format = get_mask_value_in_integer_format(mask);
+ /*if mask_integer_format = 11111111 11111111 11111111 00000000, then below
+ * fn would return 00000000 00000000 00000000 11111111*/
+ COMPLEMENT(mask_integer_format); /*Revere the bits*/
+ /*now, Perform OR-ing*/
+ unsigned int broadcast_addr = ip_addr_integer | mask_integer_format;
+ broadcast_addr = htonl(broadcast_addr);
+ /*convert the broadcast address from interger to A.B.C.D format*/
+ inet_ntop(AF_INET, &broadcast_addr, output_buffer, PREFIX_LEN + 1);
+ output_buffer[PREFIX_LEN] = '\0';
+}
+
+unsigned int
+get_ip_integer_equivalent(char *ip_address){
+
+ unsigned int ip_addr_integer = 0;
+ /*Convert ip address from A.B.C.D format to equivalent unsigned integer*/
+ inet_pton(AF_INET, ip_address, &ip_addr_integer);
+ return htonl(ip_addr_integer);
+}
+
+void
+get_abcd_ip_format(unsigned int ip_address,
+ char *output_buffer){
+
+ /*Convert an ip address from Integer to A.B.C.D format*/
+ inet_ntop(AF_INET, &ip_address, output_buffer, PREFIX_LEN + 1);
+ output_buffer[PREFIX_LEN] = '\0';
+}
+
+/*Follow the steps explained in the course*/
+void
+get_network_id(char *ip_address, char mask, char *output_buffer){
+
+ unsigned int mask_integer_format = get_mask_value_in_integer_format(mask);
+ unsigned int ip_address_integer = 0 ;
+ inet_pton(AF_INET, ip_address, &ip_address_integer);
+ unsigned int network_id = ip_address_integer & mask_integer_format;
+ network_id = htonl(network_id);
+ inet_ntop(AF_INET, &network_id, output_buffer, PREFIX_LEN + 1);
+}
+
+unsigned int
+get_subnet_cardinality(char mask_value){
+
+ return pow(2, MAX_MASK_LEN - mask_value) -2 ;
+}
+
+/*Follow the steps explained in the course*/
+int /*Return 0 if true, -1 if false*/
+check_ip_subnet_membser_ship(char *network_id,
+ char mask,
+ char *check_ip){
+
+ unsigned int check_ip_integer = 0;
+ inet_pton(AF_INET, check_ip, &check_ip_integer);
+ unsigned int mask_integer = get_mask_value_in_integer_format(mask);
+ unsigned int calculated_nw_id = check_ip_integer & mask_integer;
+ unsigned int network_id_integer = 0;
+ inet_pton(AF_INET, network_id, &network_id_integer);
+ if(network_id_integer == check_ip_integer)
+ return 0;
+ return -1;
+}
+
+int
+main(int argc, char **argv){
+
+/*Testing get_broadcast_address()*/
+{
+ printf("Testing Q1..\n");
+ char ip_address[PREFIX_LEN + 1],
+ output_buffer[PREFIX_LEN + 1];
+ memset(ip_address, 0, PREFIX_LEN + 1);
+ memcpy(ip_address, "192.168.2.10", strlen("192.168.2.10"));
+ ip_address[strlen(ip_address)] = '\0';
+ char mask = 24;
+ memset(output_buffer, 0 , PREFIX_LEN + 1);
+ get_broadcast_address(ip_address, mask, output_buffer);
+ printf("broadcast address = %s\n", output_buffer);
+ printf("Testing Q1 Done.\n");
+}
+
+/*Testing get_ip_integer_equivalent()*/
+{
+ printf("Testing Q2..\n");
+ char ip_address[PREFIX_LEN + 1];
+ memset(ip_address, 0, PREFIX_LEN + 1);
+ memcpy(ip_address, "192.168.2.10", strlen("192.168.2.10"));
+ ip_address[strlen(ip_address)] = '\0';
+ unsigned int a = get_ip_integer_equivalent(ip_address);
+ printf("a = %u\n", a);
+ printf("Testing Q2 Done.\n");
+}
+
+
+/*Testing get_abcd_ip_format()*/
+{
+ char output_buffer[PREFIX_LEN + 1];
+ memset(output_buffer, 0 , PREFIX_LEN + 1);
+ unsigned int a = 2058138165;
+ printf("Testing Q3..\n");
+ get_abcd_ip_format(htonl(a), output_buffer);
+ printf("IP address in A.B.C.D format = %s\n", output_buffer);
+ printf("Testing Q3 Done.\n");
+}
+
+
+/*Testing get_network_id()*/
+{
+ printf("Testing Q4..\n");
+ char ip_address[PREFIX_LEN + 1],
+ output_buffer[PREFIX_LEN + 1];
+ memset(ip_address, 0, PREFIX_LEN + 1);
+ memcpy(ip_address, "192.168.2.10", strlen("192.168.2.10"));
+ ip_address[strlen(ip_address)] = '\0';
+ char mask = 20;
+ memset(output_buffer, 0 , PREFIX_LEN + 1);
+ get_network_id(ip_address, mask, output_buffer);
+ printf("Network Id = %s/%u\n", output_buffer, mask);
+ printf("Testing Q4 Done.\n");
+}
+
+/*Testing get_subnet_cardinality() */
+{
+ printf("Testing Q5..\n");
+ char mask = 24;
+ printf("Cardinality = %u\n", get_subnet_cardinality(mask));
+ printf("Testing Q5 Done.\n");
+}
+
+{
+/*Testing check_ip_subnet_membser_ship()*/
+ printf("Testing Q6..\n");
+ char network_id[PREFIX_LEN + 1];
+ strncpy(network_id, "192.168.1.0", strlen("192.168.1.0"));
+ network_id[PREFIX_LEN] = '\0';
+
+ char mask = 24;
+
+ char ip_address[PREFIX_LEN + 1];
+ strncpy(ip_address, "192.168.1.10", strlen("192.168.1.10"));
+
+ int res = check_ip_subnet_membser_ship(network_id, mask, ip_address);
+ printf("IP Subnet check Result = %s\n", res == 0 ? "Membership true": "Membership false");
+ printf("Testing Q6 Done.\n");
+}
+
+ return 0;
+}
diff --git a/bitmaps_imp/bitarr.c b/bitmaps_imp/bitarr.c
index 378b6ec..e35591c 100644
--- a/bitmaps_imp/bitarr.c
+++ b/bitmaps_imp/bitarr.c
@@ -168,6 +168,7 @@ print_bit_array(bit_array_t *bitarr){
}
}
+
#if 0
int
main(int argc, char **argv){
diff --git a/bitmaps_imp/bitsop.c b/bitmaps_imp/bitsop.c
new file mode 100644
index 0000000..329c91b
--- /dev/null
+++ b/bitmaps_imp/bitsop.c
@@ -0,0 +1,48 @@
+/*
+ * =====================================================================================
+ *
+ * Filename: bitsop.c
+ *
+ * Description:
+ *
+ * Version: 1.0
+ * Created: 22/02/24 09:24:28 AM IST
+ * Revision: none
+ * Compiler: gcc
+ *
+ * Author: YOUR NAME (),
+ * Organization:
+ *
+ * =====================================================================================
+ */
+
+uint8_t
+count_bit_set(uint32_t n){
+ uint8_t bit_cnt = 0;
+
+ for(int i = 0 ; i < 32 ; i++ ){
+ if( n&(1<
+
#define IS_BIT_SET(n, pos) ((n & (1 << (pos))) != 0)
#define TOGGLE_BIT(n, pos) (n = n ^ (1 << (pos)))
#define COMPLEMENT(num) (num = num ^ 0xFFFFFFFF)
#define UNSET_BIT(n, pos) (n = n & ((1 << pos) ^ 0xFFFFFFFF))
#define SET_BIT(n, pos) (n = n | 1 << pos)
+uint8_t
+count_bit_set(uint32_t n);
+
#endif