援助

2010-02-04 74 views
1

這是我以前回答的問題在這裏上的問題的後續:援助

Reading characters on a bit level

的問題,我似乎有被瞭解位操作的基本概念C.我瞭解需要做什麼,但我實際上正在制定解決方案時遇到麻煩。

一個例子:

使用邏輯運算符改變01101010至00111110。

我理解實現解決方案的原理和掩碼的需要,但我不明白如何以編程方式進行。

我來自一個很大程度上基於C#的背景和最近纔開始用C開發

誰能給我一些指點或提示來完成的例子嗎?

以下是櫃面別人解決發現它有用:

#include <stdio.h> 
#include <stdlib.h> 
#include <limits.h.> 

int main() 
{ 
    //01101010 - 106 Decimal 
    char a = 0x6A; 

    //01010100 - 84 Decimal 
    char b = 0x54; 

    //00111110 - Uses exclusive or (XOR) 
    char c = a^b; 

    //Prints out in Hex - 62 Decimal 
    printf("%x",c); 

    return 0; 
} 
+3

C#也使用位。 – 2010-02-04 12:20:29

+0

當我使用C#的時候,我從來沒有需要這麼低,但很高興知道。 – 2010-02-04 12:44:27

+0

你最近的編輯輸出是什麼? – 2010-02-04 13:02:35

回答

2

可以XOR那些在一起。兩位的XOR是1,如果完全位中的一個是1

 
    01101010 
XOR 00111110 
= 
    01010100 

異或與此結果的價值會給你第二次。

 
    01101010 
XOR 01010100 
= 00111110 

在C:

char a = 0x6A; 
char b = 0x3E; 
char c = a^b; 

(c^a == a^b^a) && (a^b^a == b) 
+0

你能解釋你發佈的C代碼中的最終陳述嗎? 「(c^a == a^b^a)&&(a^b^a == b)」的確切位置。我想我理解它,但我只是想澄清它的目的,所以我不會誤解它。 – 2010-02-04 12:47:39

+0

沒有真正的目的。這只是一個(有效的C)真正的表達式來演示語法並重述我們所做的事情。 – 2010-02-04 12:52:16

+0

謝謝你的回答。 – 2010-02-04 13:33:58

2

我會繼續這樣的:首先看該位需要改變。如果您只需要將1s更改爲0,則需要&。如果您只需將0更改爲1,則需要|。如果您需要在兩個方向上進行更改(例如此處),則需要^,因爲它是唯一可以雙向運行的運營商,可以這麼說。

現在只需找到合適的位掩碼即可。由於1^0=10^0=0,您必須在位掩碼中設置您不想更改爲0的位。將其他人設置爲1(1^1爲0,0^1爲1),您將得到想要的結果。

+0

感謝您的指導。 – 2010-02-04 12:47:56