1. 程式人生 > >C語言一些關於位操作符的小練習

C語言一些關於位操作符的小練習

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