c语言中的位运算

小白的文章

//位运算的总结

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");
}

结果如下:

到这里我想的我的总结就结束了,其实都大同小异,没有很大的区别,需要我好好去体会。

后续如果还有一些更好的例子,我会继续总结,如有错误还请见谅。

 

 

 
 
 
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值