二進位制的翻轉(位運算的靈活運用)
阿新 • • 發佈:2018-11-11
- 在32位機器上25這個值包含下列各位:
00000000000000000000000000011001
翻轉後:(2550136832)
10011000000000000000000000000000
程式結果返回:
2550136832
#include <stdio.h> #include <stdlib.h> #include <math.h> void Reverse_bits (unsigned int value ) { int i=0; int ret=0; for (i=0;i<32;i++) { ret=ret<<1; ret=ret | ((value>>i)&1); } return ret; } //void Reverse_bits (unsigned int value ) //{ // int i=0; // int ret=0; //for (i=0;i<32;i++) // { // ret=ret+(value>>i&1)*pow(2,31-i); // } // return ret; // } int main ( ) { unsigned int value=0; unsigned int sum=0; scanf ("%d",&value); sum=Reverse_bits(value); printf ("%u\n",sum); return 0; }
- 一組資料中只有一個數字出現了一次。其他所有數字都是成對出現的。
請找出這個數字。(使用位運算)
#include <stdio.h>
int main ( )
{
int i=0;
int ret=0;
int arr[]={1,2,3,5,3,2,1};
int sz=sizeof (arr) / sizeof (arr[0]);
for (i=0;i<sz;i++)
{
ret=ret^arr[i];
}
printf ("%d\n",ret);
return 0;
}
- 不使用(a+b)/2,求平均值
int main ( )
{
inr a=0;
int b=0;
scanf ("%d%d",&a,&b);
printf ("%d",(a&b+(a^b>>1)));
//printf ("%d",(a+((b-a)>>1)));
// printf ("%d",((a+b)>>1));
return 0;
}