幾天沒寫了,今天寫一個簡單的小題 這道題乍一看,有點沒有頭緒,但是仔細考慮,也不是毫無頭緒. 思路1: 只要會十進位和二進位之間的轉換,將十進位轉二進位,然後存放到數組裡面,接著進行偶數位的操作,最後在轉十進位就好; 但是,有沒有更好的方法呢? 思路2: 電腦裡面數字的存儲本來就是二進位,為何要復 ...
幾天沒寫了,今天寫一個簡單的小題
這道題乍一看,有點沒有頭緒,但是仔細考慮,也不是毫無頭緒.
思路1:
只要會十進位和二進位之間的轉換,將十進位轉二進位,然後存放到數組裡面,接著進行偶數位的操作,最後在轉十進位就好;
但是,有沒有更好的方法呢?
思路2:
電腦裡面數字的存儲本來就是二進位,為何要複雜的轉來轉去?只要想辦法對二進位直接操作就好;
這裡我們可以考慮 >> 按位右移這一操作符,只要從第0位開始,每次按位右移2位,這樣就可以在對每一位的0或1操作就好
那麼現在考慮的就是,進行操作後,數值和以前變化關係,只要對二進位熟悉,進很容易知道,第幾位的數字,大小就是2的幾次方,假設是第n位,表示的就是 2 ^ n;
那麼,改之後的數字就比原數值小 2 ^ n ;只要減去這一個數值就好;
現在還有一個問題就是如何確定這一位是0 還是 1 ; 如果你記得 & (按位與)這個操作符就很簡單;
& 按位與 ,同一得一; 1 & 1 = 1 ; 0 & 1 = 0 ; 0 & 0 = 0 ;(這裡都是等於,不是賦值,只是為了方便);
#include<stdio.h> #include<math.h> int main() { int n = 0; int i = 0; scanf("%d",&n); int num = n; for (i = 0 ; i < 32 ; i += 2) { if (1 == ((n >> i) & 1)) { num -= pow(2 , i); } } printf("%d",num); return 0; }
簡簡單單,答案就出來了;
只需要簡簡單單幾行,不想第一種方法,翻來覆去;