2011-01-17 4 views
2

AND 및 OR 연산 만 사용할 수있는 경우 어떻게 XOR 비트 연산을 수행합니까?XOR 만 OR 및 AND

+8

는 숙제 질문처럼 소리. – Oded

+3

나는 너도 잘 할 필요가 없다고 확신한다. – Jens

+0

@Oded nope, 나는 단지 알고 싶다. 나는 AND와 OR만을 가지고 있지만 NOT이나 XOR이 아닌 스크립팅 환경에서 프로그래밍하고 있으며 XOR이 필요합니다. StackOverflow에있는 여러분은 숙제로 판단하는 것이 빠릅니다. 또한, 나는 그 링크를 이해하지 못한다. 나는 이미 질문을 올리기 전에 그것을 보았다. –

답변

1

내 자신의 스크립트 언어를 만들기 - ChrisScript가 - 당신은 단지 같은 것을 필요조차하지 않고

#!/bin/chrish 

bit XOR (bit A, bit B) 
{ 
    bit notA; 
    bit notB; 

    IF (A == 0) notA = 1 ELSE notA = 0; 
    IF (B == 0) notB = 1 ELSE notB = 0; 

    F = ((A && notB) || (notA && B)); 

    RETURN F; 
} 

를,이 같은 에뮬레이트 할 수 있습니다. 그러나 이것은 인버터의 어떤 형태가 없어도 얻을 수있는 최상의 솔루션입니다. 나는 당신이 어떤 형태의 인버터를 가지고 있지 않다는 것을 믿기 어렵다. 어떤 스크립팅 환경을 사용하고 있는가? 당신이 arithemtic 같은 +-뿐만 아니라 비트 단위와 (&) 등의 연산자와 OR (|)가있는 경우

+0

아주 제한된 Javascript 환경. –

+0

또한 비트 단위가 아닌 int로 int를 수행해야합니다. 비트 단위로 연산자가 이동하지 않아서 개별 비트를 얻을 수 없기 때문입니다. –

+1

"매우 제한됨"을 정의하십시오 - 사용중인 실제 자바 스크립트 엔진이 있습니까 (예 : Microsoft JScript)? 이 부분은 독점적 인 부분입니까, 그렇다면 제품 및 버전은 무엇입니까? 가능한 한 귀하의 환경에 관한 많은 정보를 얻는 것이 좋을 것입니다. –

-2

그물에 참고 매뉴얼과 백과 사전 사이트에서 XOR을 조사한 다음 XOR 기본 제공 함수의 기능과 동일한 코드 또는 스크립트를 작성하고 사용자 자신의 반환 값 또는 상태 값을 사용하는 것이 좋습니다. . 소프트웨어 커뮤니티 내에서 그러한 유형의 비트를 비교하는 방법을 알려주지는 못합니다.

0

난 화학식 아래 올바른지 확신 :

배타적 B =하지 ((a 및 b)의 여부를 (a + b))

+2

질문을 다시 읽으십시오. NOT은 사용할 수 없습니다. – delnan

+0

실마리가 없다. – Noray

7

진리표 및

 
    A B AND 
    T T T 
    T F F 
    F T F 
    F F F 
XOR

에 대한

진실에 대한 테이블 또는

 
    A B OR 
    T T T 
    T F T 
    F T T 
    F F F 

진실 테이블

 
    A B XOR 
    T T F 
    T F T 
    F T T 
    F F F 

따라서 XOR은 A와 B가 참일 경우 거짓임을 제외하고는 OR과 같습니다. 이 NOT없이 할 수 있으면

그래서, (A는 B OR) (NOT (A와 B)), 이는 (A 또는 B)와 (A 낸드 B)

 
    A B OR AND NAND [(A OR B) AND (A NAND B)] 
    T T T T F  F 
    T F T F T  T 
    F T T F T  T 
    F F F F T  F 

확실하지되며, 또는 NAND

+2

나는 우리 모두가 그 작업들이 어떻게 진리표가 어떻게 생겼는지 안다고 생각한다. 문제는 첫 번째 두 개를 결합하여 세 번째를 형성 할 수 있는가, 그렇다면 어떻게? – delnan

+1

숙제 일 때 제 대답을 시작했습니다. 대답이 아니라 방향이되기. 나는 그것이 끝날 수 있다고 생각하지 않는다. –

1

Wikipedia's entry on XOR이 자세히 설명합니다. 아마도 SO 질문을하기 전에 확인하는 첫 번째 좋은 장소 일 것입니다.

마스크가 해제 된 것에 대해 신경 쓰지 않는다면 코드를 작성하는 가장 쉬운 방법은 평등하지 않은 연산자를 사용하는 것입니다.

2

는이 같은 비트 XOR을 수행 할 수 있습니다

int bitwise_XOR(int a, int b) 
{ 
    return (a + b) - (a & b) - (a & b); 
} 

이 작동하는 이유이다 우리 주어진 비트 위치의 합이 < = 1 일 때 XOR과 동등한 전체 덧셈을 수행 한 다음 2 * (a & b)을 뺀 자리 올림 (1 + 1)이 발생하는 경우를 수정합니다.

중간 용어가 오버플로 되어도 "정상적으로 동작하는"정수 (2의 보수, 오버플로의 모듈로 2 줄 바꿈 등)가 있다고 가정 할 때도 작동합니다.C에서

1

".이 시스템 ({T, F}, 등) 및 ({T, F} 또는) monoids하다"x^y = (x & ~y) | (~x & y)

1

"시스템 ({T, F}, xor)은 monoids와 다른 가역성을 갖는 abelian 그룹입니다.

따라서 'and'및 'or'은 'xor'연산을 생성하지 못합니다.

출처 :

관련 문제