小白的文章
//位运算的总结
1.一组数据中只有一个数字出现了一次。
其他所有数字都是成对出现的。请找出这个数字。(使用位运算)
int main()
{
int i = 0;
int arr[] = {1,2,1};
int sum=0;
int a = arr[0];
for (i = 1; i < sizeof(arr )/ sizeof(arr[0]); i++)
{
a = (a^arr[i]); //各个位异或
}
printf("%d\n", a);
system("pause");
}
//结果如下:
<img alt="" data-cke-saved-src="https://img-blog.csdnimg.cn/2022010702520853398.png" src="https://img-blog.csdnimg.cn/2022010702520853398.png" />
//上面的例子很好的说明了位运算的强大,由于每个位都是成对出现的所以当各个位异或时,成对出现的数字就变成了0,而0异或A结果为A,由此可以知最后的结果就是不成功对//出现的数字。
2.求二进制中补码1的个数
void show_binary(unsigned num) { int i = 0; unsigned int len = sizeof(int)* 8; unsigned int temp = 1 << (len-1); for (i = 0; i < len; i++) { printf("%c",num&temp? '1':'0' ); temp >>= 1; } printf("\n"); } int main() { unsigned int num; printf("请输入一个数:"); scanf("%d", &num); show_binary(num); int i = 0; int count = 0; for (i = 0; i < 32; i++) { if ((num&1) == 1) //num^0==1 两个条件都可以
} count++; } num >>= 1; } printf("这个数的二进制数中有%d个1\n", count);
system("pause"); }
//结果如下:
3.不使用(a + b) / 2这种方式,求两个数的平均值。 void show_binary(unsigned num) { int i = 0; unsigned int len = sizeof(int)* 8; unsigned int temp = 1 << (len-1); for (i = 0; i < len; i++) { printf("%c",num&temp? '1':'0' ); temp >>= 1; } printf("\n"); } int main() { int a; int b; printf("请输入两个数:《"); scanf("%d%d",&a,&b); show_binary(a); show_binary(b); show_binary((a&b) + ((a^b) >> 1)); printf("这两个数的平均数:%d\n", (a&b) + ((a^b) >> 1));
system("pause"); }
//结果如下:
//位运算实现加法 int main() { int a ; int b ; printf("请输入这两个数:《"); scanf("%d%d",&a,&b); printf("a+b=%d\n", (a^b) ^ ((a&b) << 1));//a&b<<1 为进位,a^b为不进位 system("pause"); }
结果如下:
4.写一个宏可以将一个数字的奇数位和偶数位交换。 void show_binary(unsigned num) { int i = 0; unsigned int len = sizeof(int)* 8; unsigned int mask = 1 << (len - 1); for (i = 0; i < len; i++) { printf("%c", num & mask ? '1' : '0'); mask >>= 1; } printf("\n");
} #define SWAP(X)\
(((x&(0x55555555)) << 1) | ((x&(0xAAAAAAAA)) >> 1))
//和0x55555555按位与得到奇数位左移1位变成原来偶数为,原奇变0 //和0xAAAAAAAA按位与得到偶数为右移1位变成原来奇数位,原偶变0 //将结果按位或就得到交换后的数 int main() { int x = 10; printf("x=%d,变换后为%d\n",x,SWAP(x)); show_binary(x); show_binary(SWAP(x));
system("pause"); }
5.写一个宏可以将一个数字的奇数位和偶数位交换。
void show_binary(unsigned num)
{
int i = 0;
unsigned int len = sizeof(int)* 8;
unsigned int mask = 1 << (len - 1);
for (i = 0; i < len; i++)
{
printf("%c", num & mask ? '1' : '0');
mask >>= 1;
}
printf("\n");
}
#define SWAP(X)\
(((x&(0x55555555)) << 1) | ((x&(0xAAAAAAAA)) >> 1))//和0x55555555按位与得到奇数位左移1位变成原来偶数为,原奇变0
//和0xAAAAAAAA按位与得到偶数为右移1位变成原来奇数位,原偶变0
//将结果按位或就得到交换后的数
int main()
{
int x = 10;
printf("x=%d,变换后为%d\n",x,SWAP(x));
show_binary(x);
show_binary(SWAP(x));
system("pause");
}
结果如下:
到这里我想的我的总结就结束了,其实都大同小异,没有很大的区别,需要我好好去体会。
后续如果还有一些更好的例子,我会继续总结,如有错误还请见谅。