C語言中移位、邏輯運算符的簡單應用

&運算符
一、 計算二進制中1 的個數比如: 15       0000 1111       4 個 1
要求其數字的存儲方式爲int

int count_one_bits(unsigned int value)//計算1的位數函數
{
	int count;
	count=0;
	while(value)
	{
		count++;
		value=value&(value-1);//每&一次,減少一個二進制數中的“1”的個數;
	}
	return count;
}

&運算符和>>運算符的聯合應用

二、獲取一個數二進制序列中所有的偶數位和奇數位,分別輸出二進制序列。

#include <stdio.h>
#include <stdlib.h>
int main()
{
int i,j;
int num;//定義輸入變量
int a[16],b[16];//定義存放奇數位和偶數位的數組
printf("請輸入一個十進制數字:");
scanf("%d",&num);
for (i = 0 ,j = 0; j < 32; i++, j=j+2) //獲取二進制數列的奇數位
{
a[15-i] = ( num>>j )&1;
}
printf("從高位到低位奇數位分別爲:");
for (i = 0; i < 16; i++) //從高位到低位輸出其二進制奇數位
{
printf("%d ",a[i]);
}

for (i = 0 ,j = 1; j < 32; i++, j=j+2) //獲取二進制數列的偶數位
{
b[15-i] = ( num>>j )&1;
}
printf("\n從高位到低位偶數位分別爲:");
for (i = 0; i < 16; i++) //從高位到低位輸出其二進制偶數位
{
printf("%d ",b[i]);
}
system("pause");
return 0;
}

 | 運算符


三、判斷名次是否連續

/*將名次對應一個數中的二進制位*/

int ret = 0, flag = 0;
ret |= (1 << (a - 1));
ret |= (1 << (b - 1));
ret |= (1 << (c - 1));
ret |= (1 << (d - 1));
ret |= (1 << (e - 1));
while (ret)
{
	if (0 == ret % 2)
	{
		flag = 1;
	}
	ret / = 2;
}
if (0 == flag)
{
	printf("比賽的名次爲:\n");
	printf("a=%d\nb=%d\nc=%d\nd=%d\ne=%d\n", a, b, c, d, e);
}

四、尋找兩個int(32位)整數m和n的二進制表達中,有多少個位(bit)不同

int different_bits(int num_1, int num_2)
{
	int count = 0;
	for (int i = 0; i < 32; i++)
	{
		if (((num_1 >> i) & 1) ^ ((num_2 >> i) & 1))
		{
			count++;
		}
	}
	return (count);
}

五、將一個無符號數的二進制數逆置

unsigned int  reverse_bit(unsigned int num)
{
	int i = 0;
	unsigned int ret = 0;
 	for (i = 0; i < 32; i++)
	{
		ret<<=1;
		ret |= ((num >> i) & 1);
	}
	return (ret);
}

六、求兩個數的平均值,無溢出

int average(int a, int b)
{
	return((a & b) + ((a ^ b) >> 1));
}

七、找出一組數據中單獨出現的數字

int find_only(int arr[], int size)
{
	for (int i = 1; i < size; i++)
	{
		arr[0] ^= arr[i];
	}
	return (arr[0]);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章