原文链接:Bitwise Operation Explained
1.统计一个数置位为1的个数
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
#include
<
stdio.h
>
int __numOf_SET_Bits( int var)
{
if (var == 0 ) return 0 ;
else return (var & 01 ) ? 1 + __numOf_SET_Bits(var >> 1 ):__numOf_SET_Bits(var >> 1 );
}
int main()
{
int var = 128 ;
printf( " NumofBits:%d/n " ,__numOf_SET_Bits(var));
return 0 ;
}
int __numOf_SET_Bits( int var)
{
if (var == 0 ) return 0 ;
else return (var & 01 ) ? 1 + __numOf_SET_Bits(var >> 1 ):__numOf_SET_Bits(var >> 1 );
}
int main()
{
int var = 128 ;
printf( " NumofBits:%d/n " ,__numOf_SET_Bits(var));
return 0 ;
}
2,判断一个数是奇数还是偶数
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
#include
<
stdio.h
>
#define isEven(a)((((a)&01)==0)?1:0)
int main()
{
int var = 1 ;
if (isEven(var))
{
printf( " %disaevennumber/n " ,var);
}
else
printf( " %disaoddnumber/n " ,var);
return 0 ;
}
#define isEven(a)((((a)&01)==0)?1:0)
int main()
{
int var = 1 ;
if (isEven(var))
{
printf( " %disaevennumber/n " ,var);
}
else
printf( " %disaoddnumber/n " ,var);
return 0 ;
}
方法二:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
#include
<
stdio.h
>
#define isEven(a)((((a)%2)==0)?1:0)
int main()
{
int var = 11 ;
if (isEven(var))
{
printf( " %disaevennumber/n " ,var);
}
else
printf( " %disaoddnumber/n " ,var);
return 0 ;
}
#define isEven(a)((((a)%2)==0)?1:0)
int main()
{
int var = 11 ;
if (isEven(var))
{
printf( " %disaevennumber/n " ,var);
}
else
printf( " %disaoddnumber/n " ,var);
return 0 ;
}
3,判断一个数是否是2的幂次方
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
#include
<
stdio.h
>
#define __isPower_of_TWO(a)(((a)&(a-1))==0)?1:0
int main()
{
int arr[] = { 1 , 2 , 3 , 4 , 5 , 8 , 9 , 16 };
int i = 0 ;
for (;i < sizeof (arr) / sizeof (arr[ 0 ]);i ++ )
{
if (__isPower_of_TWO( * (arr + i)))
printf( " %dhasaformofPowerofTwo/n " , * (arr + i));
else
printf( " %disnotintheform/n " , * (arr + i));
}
return 0 ;
}
#define __isPower_of_TWO(a)(((a)&(a-1))==0)?1:0
int main()
{
int arr[] = { 1 , 2 , 3 , 4 , 5 , 8 , 9 , 16 };
int i = 0 ;
for (;i < sizeof (arr) / sizeof (arr[ 0 ]);i ++ )
{
if (__isPower_of_TWO( * (arr + i)))
printf( " %dhasaformofPowerofTwo/n " , * (arr + i));
else
printf( " %disnotintheform/n " , * (arr + i));
}
return 0 ;
}
方法二:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
#include
<
stdio.h
>
#define __isPower_of_TWO(a)(((a)&(-a))==a)?1:0
int main()
{
int arr[] = { 1 , 2 , 3 , 4 , 5 , 8 , 9 , 16 };
int i = 0 ;
for (;i < sizeof (arr) / sizeof (arr[ 0 ]);i ++ )
{
if (__isPower_of_TWO( * (arr + i)))
printf( " %dhasaformofPowerofTwo/n " , * (arr + i));
else
printf( " %disnotintheform/n " , * (arr + i));
}
return 0 ;
}
#define __isPower_of_TWO(a)(((a)&(-a))==a)?1:0
int main()
{
int arr[] = { 1 , 2 , 3 , 4 , 5 , 8 , 9 , 16 };
int i = 0 ;
for (;i < sizeof (arr) / sizeof (arr[ 0 ]);i ++ )
{
if (__isPower_of_TWO( * (arr + i)))
printf( " %dhasaformofPowerofTwo/n " , * (arr + i));
else
printf( " %disnotintheform/n " , * (arr + i));
}
return 0 ;
}
方法三:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
#include
<
stdio.h
>
#include < stdlib.h >
int __numOf_SET_Bits( int var)
{
if (var == 0 ) return 0 ;
else return (var & 01 ) ? 1 + __numOf_SET_Bits(var >> 1 ):__numOf_SET_Bits(var >> 1 );
}
int main()
{
int arr[] = { 1 , 2 , 3 , 4 , 5 , 8 , 9 , 16 };
int i = 0 ;
for (;i < sizeof (arr) / sizeof (arr[ 0 ]);i ++ )
{
if (__numOf_SET_Bits(arr[i]) == 1 )
printf( " %dhasaformofPowerofTwo/n " , * (arr + i));
else
printf( " %disnotintheform/n " , * (arr + i));
}
system( " pause " );
return 0 ;
}
#include < stdlib.h >
int __numOf_SET_Bits( int var)
{
if (var == 0 ) return 0 ;
else return (var & 01 ) ? 1 + __numOf_SET_Bits(var >> 1 ):__numOf_SET_Bits(var >> 1 );
}
int main()
{
int arr[] = { 1 , 2 , 3 , 4 , 5 , 8 , 9 , 16 };
int i = 0 ;
for (;i < sizeof (arr) / sizeof (arr[ 0 ]);i ++ )
{
if (__numOf_SET_Bits(arr[i]) == 1 )
printf( " %dhasaformofPowerofTwo/n " , * (arr + i));
else
printf( " %disnotintheform/n " , * (arr + i));
}
system( " pause " );
return 0 ;
}
4,不使用第三个数,交换两个数
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
#include
<
stdio.h
>
void __SWAP( int * a, int * b)
{
* a = * a ^ * b;
* b = * a ^ * b;
* a = * a ^ * b;
}
int main()
{
int a = 5 ,b = 6 ;
printf( " Beforeswap:a=%d<=====>b=%d/n " ,a,b);
__SWAP( & a, & b);
printf( " Afterswap:a=%d<=====>b=%d/n " ,a,b);
return 0 ;
}
void __SWAP( int * a, int * b)
{
* a = * a ^ * b;
* b = * a ^ * b;
* a = * a ^ * b;
}
int main()
{
int a = 5 ,b = 6 ;
printf( " Beforeswap:a=%d<=====>b=%d/n " ,a,b);
__SWAP( & a, & b);
printf( " Afterswap:a=%d<=====>b=%d/n " ,a,b);
return 0 ;
}
5,异或双向链表
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
#include
<
stdio.h
>
#include < stdlib.h >
#include < assert.h >
typedef struct XOR_based_Node
{
int data; // 数据域
unsigned long compressedAddress;
}node;
node * head = NULL; // 异或双向链表表头
void add_element_to_list(node ** headRef, int data)
{ // 插入表头
node * newNode = (node * )malloc( sizeof (node));
assert(newNode);
newNode -> compressedAddress = (unsigned long )( * headRef);
newNode -> data = data;
if ( * headRef != NULL)
( * headRef) -> compressedAddress ^= (unsigned long )newNode;
* headRef = newNode;
}
void printList(node * head)
{ // 输出表
unsigned long prev = 0 ;
while (head)
{
unsigned long next = prev ^ head -> compressedAddress;
printf( " %d " ,head -> data);
prev = (unsigned long )head;
head = (node * )next;
}
printf( " /n " );
}
int main( void )
{
int i = 0 ;
for (;i < 10 ;i ++ )
add_element_to_list( & head,i);
printList(head);
return 0 ;
}
#include < stdlib.h >
#include < assert.h >
typedef struct XOR_based_Node
{
int data; // 数据域
unsigned long compressedAddress;
}node;
node * head = NULL; // 异或双向链表表头
void add_element_to_list(node ** headRef, int data)
{ // 插入表头
node * newNode = (node * )malloc( sizeof (node));
assert(newNode);
newNode -> compressedAddress = (unsigned long )( * headRef);
newNode -> data = data;
if ( * headRef != NULL)
( * headRef) -> compressedAddress ^= (unsigned long )newNode;
* headRef = newNode;
}
void printList(node * head)
{ // 输出表
unsigned long prev = 0 ;
while (head)
{
unsigned long next = prev ^ head -> compressedAddress;
printf( " %d " ,head -> data);
prev = (unsigned long )head;
head = (node * )next;
}
printf( " /n " );
}
int main( void )
{
int i = 0 ;
for (;i < 10 ;i ++ )
add_element_to_list( & head,i);
printList(head);
return 0 ;
}