C語言一些關於位操作符的小練習
阿新 • • 發佈:2019-01-01
1.程式設計實現:
兩個int(32位)整數m和n的二進位制表達中,有多少個位(bit)不同?
輸入例子:
1999 2299
輸出例子:7
#include <stdio.h>
#include<stdlib.h>
int count_diff_bit(int m, int n)
{
int num = m^n;
int count = 0;
while(num)
{
count++;
num = num&(num-1);
}
return count;
}
int main()
{
int num1 = 0;
int num2 = 0;
int ret = 0;
while (1)
{
printf("請輸入你要檢測的兩個數:\n");
scanf("%d%d", &num1, &num2);
ret = count_diff_bit(num1, num2);
printf("%d", ret);
}
system("pause");
return 0;
}
2.編寫函式:
unsigned int reverse_bit(unsigned int value);
這個函式的返回 值value的二進位制位模式從左到右翻轉後的值。
如:
在32位機器上25這個值包含下列各位:
00000000000000000000000000011001
翻轉後:(2550136832。。)
10011000000000000000000000000000
程式結果返回:
2550136832
#include<stdio.h>
#include<stdlib.h>
unsigned int reverse_bit(unsigned int value)
{
unsigned int m = 0;
int i = 0;
for (i = 0; i < 32-1; i++)
{
m |= value & 1;
m <<= 1;
value >>= 1;
}
return (unsigned int)m;
}
int main()
{
unsigned int num =0 ;
unsigned int ret = 0;
scanf("%u", &num);
ret = reverse_bit(num);
printf("%u", ret);
system("pause");
return 0;
}
3.不使用(a+b)/2這種方式,求兩個數的平均值。
#include<stdio.h>
#include<stdlib.h>
int Average_value(const int num1, const int num2)
{
int a = num1;
int b = num2;
int aver = 0;
/*aver = a + (b - a) / 2;*/
aver = (a&b) + ((a^b) >> 1);
return aver;
}
int main()
{
int num1 = 0;
int num2 = 0;
int ret;
printf("請輸入你所要求平均值的兩個數:");
scanf("%d%d", &num1, &num2);
ret = Average_value(num1, num2);
printf("%d", ret);
system("pause");
return 0;
}
4.一組資料中只有一個數字出現了一次。
其他所有數字都是成對出現的。請找出這個數字。(使用位運算)
#include<stdio.h>
#include<stdlib.h>
int search(int arr[], int sz)
{
int i = 0;
int m = 0;
for (i=0; i<sz; i++)
{
m^= arr[i];
}
return m;
}
int main()
{
int ret = 0;
int arr[] = {1,2,3,2,1,4,4,6,6};
int sz = sizeof(arr) / sizeof(arr[0]);
ret = search(arr, sz);
printf("%d", ret);
system("pause");
return 0;
}
交換二進位制的奇數位和偶數位
例如: 00001010
變成00000101
和前面翻轉二進位制數其實差不多,我們可以將二進位制的從最高位到最低位依次求出,也就是sum,同樣的ret如果左移32次的話,就會將最高位丟失,所以讓ret=0,先無用的左移一次也就是把ret=ret<<1放到賦值前面,移位並求出最高位的值後,我們就讓第31位給到ret的最低位,然後再左移,再讓第32位給到最低位。總共執行16次就可以將所有的二進位制奇數位和偶數位互換。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int exchange(int val)
{
int sum = 0;
int ret = 0;
int i = 0;
for (i = 16; i > 0; i--)
{
ret = ret << 1;
sum = (val >> (2 * i - 2) & 1);
ret = sum | ret;
ret = ret << 1;
sum = (val >> (2 * i - 1) & 1);
ret = ret | sum;
}
return ret;
}
int main()
{
int val = 14;
int num = EX(val);
printf("%d", num);
system("pause");
return 0;
}