1. 程式人生 > >C語言 巨集的使用 讓一個數的二進位制奇數位與偶數位互換

C語言 巨集的使用 讓一個數的二進位制奇數位與偶數位互換

C語言 巨集的使用 

巨集定義是預處理的一種,巨集有操作符來表示一個字串

巨集的格式為:
#define  巨集名   字串

define是預處理命令  #也是一條預處理命令,所有的預處理命令都是由 # 開頭。
1.巨集定義必須寫在函式外部,不能寫在函式裡,它的作用域為巨集定義命令的起始到程式結束,如果要提前終止可使用 #undef 命令結束。
2.巨集定義的字串只是一個簡單的替換
3.巨集定義不是說明語句,在行末尾無需加入分號,如果加入則連分號也一起替換。

奇數位與偶數位互換使用巨集替換:

例如10(二進位制1010),交換後變成了 5(0101);
可以先把奇數位提取出來 即 X&0101 ,再左移一位變成偶數位  (x&(0x55555555)) << 1;
然後可以把偶數位提取出來即 X&1010,再右移一位變成奇數位 (x&(0xAAAAAAAA))>>1)
最後用或操作把奇偶位連線起來就行了 ((x&(0x55555555)) << 1) | ((x&(0xAAAAAAAA))>>1)
注意:這裡的0x55555555,0xAAAAAAAA是十六進位制這樣做的好處是,不需要將整數換成二進位制,直接位操作返回的就是交換後的十進位制整數,操作少。


#include <stdio.h>
#define  swap_H(x) ((x&0x55555555)<<1) | ((x&0xAAAAAAAA)>>1)  //為巨集定義的奇數位與偶數位互換
int main()
{
	int a=10;
	printf("轉換前a=%d  ",a);
	printf("轉化後a=%d",swap_H(a));
}



相關推薦

C語言 巨集的使用 個數二進位制奇數偶數互換

C語言 巨集的使用 巨集定義是預處理的一種,巨集有操作符來表示一個字串巨集的格式為:#define 巨集名 字串define是預處理命令  #也是一條預處理命令,所有的預處理命令都是由 # 開頭。

c語言】將個數二進位制序列逆序,然後輸出逆序之後的二進位制序,所對應的數

<pre name="code" class="cpp">// 將一個數的二進位制序列逆序,然後輸出逆序之後的二進位制序,所對應的數 #include <stdio.h> // 從原數拿出最低位,放到mid中,mid左移,原數右移 int r

C語言】求個數二進位制模式從左到右翻轉後對應的十進位制值。

用函式unsigned int reverse_bit(unsigned int value)實現想要的功能 value是我們想要求的值。 #include <stdio.h> #include <math.h> unsigned

C語言】求個數二進位制中 1 的個數

求一個數的二進位制的1的個數 1,通過模除的方法 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> int main() { int i = 0;

C語言】推斷個數是否為2的n次方

post data- popu scanf scan ng- 輸入 ont print //推斷一個數是否為2的n次方 #include <stdio.h> int is_two_n(int num) { if ((num&(num - 1))

c語言實現輸出個數的每

文件 語言 use 我們 str 一次 在屏幕上 ont popu 比方輸入1234。在屏幕上打印出1 2 3 4 代碼展示: 方法一: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #

C語言實現輸入個數,輸出這個數的立方根

#include<stdio.h> int main() { double x,x1,x2,w; scanf("%lf",&x); x1=x; x2=(2.0*x1+x/(x1*x1))/3.0; w=(x2-x1)/x1; if(w&

C語言實現輸入個數,輸出這個數的sin值

#include<stdio.h> double shang(double x,int n) { int i; double k=1; for(i=0;i<n;i++) { k=k*x; } return k; } int

C語言中求個數的個位數,十位數...

求出0~999之間的所有“水仙花數”並輸出。 “水仙花數”是指一個三位數,其各位數字的立方和確好等於該數本身,如;153=1+5+3?,則153是一個“水仙花數”。 /* 在數論中,水仙花數(Narcissistic number)也稱為自戀數、自冪數、阿姆斯壯數或阿姆斯特朗數(Armstrong

C語言之判斷個數是否為素數

#include "stdio.h" #include"time.h" #include"math.h" int isPrimeNumber(int number) { //判斷是否為素數 float sqrtOfNum = sqrt((double) number); for

C語言:求個數是否為素數

#include<stdio.h> #include<assert.h> //求一個數是否為素數 bool IsPrime(int n)//布林運算, { assert(n != 1); if(n == 1)//是1返回fal

c語言實現輸入個數,輸出這個數的sin的值

#include<stdio.h> double shang(double x,int n) { int i; double k=1; for(i=0;i<n;i++) { k=k*x;

C語言找出個數組中重複的元素

在一個數組中的數字是連續的,但是這個陣列中有一個數重複出現了一次,找出這個數。 #include <stdio.h> int main() { int i; int tmp=10; int swap=0; int a[10]={1,3,5,

C語言】判斷個數是不是迴文數

 所謂迴文數,就是說一個數字從左邊讀和從右邊讀的結果是一模一樣的。 首先,我們來判斷一下一個數是否為迴文數: #define _CRT_SECURE_NO_WARNINGS 1 #include&

C語言實現:個數組中只有兩個數字是出現次,其他所有數字都出現了兩次。

思路:異或陣列中的每一個數,最終出現的結果是兩個只出現一次數字的異或結果,,因為兩個陣列不一樣,所以異或結果不為0,二進位制結果有一個是1.在結果中找到第一個為1的位置,記為n,然後陣列右移n位,為1,為0,分別輸出兩個數#include <stdio.h> #i

c語言】判斷個數n能否同時被3和5整除

// 判斷一個數n能否同時被3和5整除 #include <stdio.h> int main() { int n; printf("請輸入一個整數:"); scanf("%d",&n); if( n % 3 == 0 &&

C語言:判斷個數是否為素數

題目來源:大工慕課 連結 作者:Caleb Sung 注意事項 判斷一個數是否為質數,首先我們需要知道質數的定義:對於大於1的數,如果除了1和它本身,它不能再被其它正整數整除,那麼我們說它

C語言 java 判斷個數是不是質數

#include<stdio.h> #include<math.h> /* 質數判斷的基本思路:對於正整數n(n>1),用2~根號n去除它,如果存在整除的情況,則n不是質

C語言】判斷個數的奇偶(操作)

//判斷一個數的奇偶 #include <stdio.h> int is_signal(int num) { if (num & 1) return 1; else r

C語言】判斷個數是否為2的n次方

//判斷一個數是否為2的n次方 #include <stdio.h> int is_two_n(int num) { if ((num&(num - 1))) //去掉一個1