&運算符 一、 計算二進制中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]); }