/* MACRO for bitwise operation's */
# ifndef __BITWISE__
# define __BITWISE__
/* Assign the Maximum value of the integer */
# define MAX (-1) >> 1
/* Mask the odd bit's in the given number */
# define O_MASK 0xAAAAAAAA
/* Mask the even bit's of the given number */
# define E_MASK 0x55555555
/* Find the number is power of four or not */
# define P_FOUR(num) (num & O_MASK) ? (!(num & (~(-num)))) ? 1 : 0 : 0
/* Find the number is power of two or not */
# define P_TWO(num) (num) ? (num & (~(-num))) ? 0 : 1 : 0
/* Find the given number is multiply by 2,4,8 or not */
# define MUL_2(num) (num & 1) ? 0 : 1
# define MUL_4(num) (num & 3) ? 0 : 1
# define MUL_8(num) (num & 7) ? 0 : 1
/* Find the given number is multiply by 9 or not */
# define MUL_9(num) ((num << 3) | (num))
/* Arithmetic addition of two number's using bitwise operation */
# define ADD(a,b) while(b = ((((a ^= b) ^ b) & b ) << 1 )) ;
/* Arithmetic subtraction of two number's using bitwise operation */
# define SUB(a,b) while(b = ((~((a ^= b) ^ b) & b ) << 1 )) ;
/* Set the particular bit in the given number */
# define SET(num,pos) num = num | (1 << pos)
/* Clear the particular bit in the given number */
# define CLEAR(num,pos) num = num & (~(1 << pos))
/* Set two bit's in the given number using two different position's */
# define SET_2_BIT(num,p1,p2) num = ((num | (1 << p1)) | (num | (1 << p2)))
/* Complement the bit's in a given number for a particular source and destination position */
# define COMP(num,src,des) num = num ^ ( (unsigned) -1 >> ((32 - (des-src))-1) ) << src
/* Complement the even bit's in the number */
# define C_EVEN(num) num = num ^ E_MASK
/* Complement the odd bit's in the number */
# define C_ODD(num) num = num ^ O_MASK
/* Toggle the entire bit's in the number */
# define TOG(num) num = ~num
/* Find the greatest number from the given two number's */
# define SWP_NIB_CHR(n) n = (n << 4) | (n >> 4)
# define GREAT(num1,num2) ((num1 - num2) >> 31) ? num2 : num1
/* Increment operator using bitwise */
# define INC(num) num = -(~num)
/* Decrement operator using bitwise */
# define DEC(num) num = ~(-num)
/* Check the MSB bit is set or not */
# define HIGHT(num) (num & (1 << (sizeof(num)*8)-1)) ? 1 : 0
/* Check the LSB bit is set or not */
# define LOW(num) (num & 1) ? 1 : 0
/* Right Rotate the given number by n times */
# define R_RIGHT(num,n) num = ((num >> n) | (num << 32-n))
/* Left Rotate the given number by n times */
# define R_LEFT(num,n) num = ((num << n) | (num >> 32-n))
/* Swap the two integer number's using bitwise */
# define SWAP_NUM(a,b) a = a ^ b; b = a ^ b; a = a ^ b;
/* Swap the adjacent bit's in the given number */
# define SWAP_ADJ(num) num = (((num & E_MASK) >> 1) | ((num & O_MASK) << 1));
/* Swap the nibble's from the given integer number */
# define INT(num) num = ((num << 28) | (num >> 28) | (num & 0x0ffffff0))
# define INT_S(num) num = ( (num & 0x0A0A0A0A ) >> 4 ) | ( ( num & 0xA0A0A0A0) << 4 )
/* Swap the nibble's from the given charecter */
# define SWP_NIB_CHR(n) n = (n << 4) | (n >> 4)
/* convert the charecter from upper to lower case */
# define TO_LOWER(c) (c >= 65 && c <= 91) ? c |= 1 << 5 : 0
/* convert the charecter from lower to upper case */
# define TO_UPPER(c) (c >= 97 && c <= 122) ? c ^= 1 << 5 : 0
/* count trailing zeros in the given number */
static inline int trailing(unsigned int num)
{
int count = 0;
for(;((!(num & 1)) && count!= 32 );num >>= 1,count++) ;
return count;
}
/* count the number of ones in an given number */
static inline int count_set(unsigned int num)
{
int count = 0;
for(; num ;count += num & 1, num >>= 1) ;
return count;
}
/* print the next largest number containing same number of 1's and 0's */
static inline int next_large(unsigned int num)
{
int f,s = 0;
for(f = count_set(num) ; f != s ; s = count_set(INC(num))) ;
return num;
}
/* check whether given number is bit pallindrome or not */
static inline int palindrome(unsigned int num)
{
int i;
for(i = 0;(((num >> i) & 1 ) == ((num >> 31-i) & 1)) && i < 16; i++) ;
(i == 16)? 1 : 0;
}
/* Display the binary form of the given number */
void show(int num)
{
int i;
for(i = 31;i>=0;i--)
(num & (1 << i)) ? printf("1 ") : printf("0 ");
}
# endif
/* End of the file */
/* fun swap the bits in an integer
*
* @n,@d,@s
*n : number
d : destination bit position in number 'n'
s : source bit position in number 'n'
* return an integer obtained after swapping the bits
*
*/
int bit_swap(int n , int d , int s)
{
return (((n >> d) ^ (n >> s )) & 1 ) ? (n ^ ( (1 << d) |
(1 << s) )) : n ;
}
/* fun copy a bit from a number from specified postion to specified position in the other number
*
* @snum,@s,@dnum,@d
*
* return integer
*/
int bit_cp(int s , int d , int snum , int dnum)
{
return (snum & (1 << s )) ? ( dnum | ( 1 << d ) ) : (dnum & ~(1 << d ));
}
/* complements the even bits in an integer */
int even_bit_toggle(int num)
{
int tmp = 1;
while( tmp ) {
num ^= tmp;
tmp <<= 2;
}
return num;
}
/* fun to_lower converts the input character ch into lower case if it is upper case
*
* @ch
*
* return lower case of the i/p if it was upper case , else returns as it is
*/
int to_lower(int ch)
{
return (ch >= 65 && ch <= 90) ? ch | ( 1 << 5 ) : ch ;
}
/* fun converts the input character into upper case ,if it was lower case
*
*@ch
return upper case character if the input is lower case else return as it is
*/
int to_upper(int ch)
{
return (ch >= 97 && ch <= 122) ? ch & ~( 1 << 5) : ch ;
}
/* fun add , performs bitwise addition on two integers
*
* @num1,@num2
*
* return sum of the two integers num1 and num2
*
*/
int add(int num1 , int num2)
{
int tmp = 0;
while( num2 ) {
tmp = num1 ^ num2;
num2 = (num1 & num2) << 1; /*left shifting carry by 1 */
num1 = tmp;
}
return num1;
}
/* fun add , performs bitwise subtraction on two integers
*
* @num1,@num2
*
* return subtraction of the two integers num1 and num2
*
*/
int sub(int num1 , int num2)
{
int tmp = 0;
while( num2 ) {
tmp = num1 ^ num2;
num1 = tmp;
num2 = (num1 & num2) << 1; /*right shifting carry by 1 */
}
return num1;
}
/* fun mul , performs bitwise multiplication on two integers
*
*@num1,@num2
returns product of the integers num1 and num2
*/
int mul(int num1 , int num2)
{
int sign1 = 1 , sign2 = 1 ;
if ( num1 < 0 )
sign1 = -1; /* storing the sign */
if(num2 < 0)
sign2 = -1;
int sum = 0; /* to store the product of num1 and num2 */
for( num1 *= sign1 , num2 *= sign2; num2 ; num1 <<= 1 , num2 >>= 1)
if ( num2 & 1)
sum += num1;
return (sum * sign1 * sign2 );
}
/* fun div , performs bitwise division through repeated subtraction
*
*@num1,@num2
returns quotient after the division
*/
int sub(int num1 , int num2);
int _div(int num1 , int num2)
{
int sign1 = 1 , sign2 = 1, count = 0;
if ( num1 < 0 )
sign1 = -1;
if(num2 < 0)
sign2 = -1;
num1 *= sign1; /* will turn num1 and num2 positive ,if it was negative */
num2 *= sign2;
while((num1 >= num2)) {
num1 = sub(num1,num2);
++count;
}
return (count * sign1 * sign2 );
}
/* fun rotate the bits in a number in either direction
*
*
* @num ,@nbit ,@dir
*
*dir == 0 : left rotation dir == 1 , right rotation
* return obtained integer after the rotation
*
*/
int size();
int rotate_bit( int num , int nbit , int dir)
{
//return dir ? ((num >> nbit) | ( num << (size() - nbit))) :(( num << nbit) | ( num >> (size() - nbit) ));
return dir ? ((num >> nbit) | ( num << (size() - nbit))) :(( num << nbit) | ( num >> (size() - nbit) ));
}
/* fun size calculates size of a compiler , using integer, var is assigned with ~0
* i.e all bits are set , counting each set bit with every right shift untill it reaches to 0
*
* @void
*
* return the size of a compiler
*
*/
int size()
{
int s = 1;
unsigned var = (unsigned) ~0;
for ( ; (var >>= 1 ) ; ++s)
;
return s;
}
No comments:
Post a Comment