2012-01-23 5 views

답변

3

Benoit이 꽤 많이 말했습니다. 하나는 보체이고, 나머지는이 비트이고, 다른 하나는이 비트입니다.

something&=~3; 

종종 두 개의 비트에 초점을 맞추고 있다는 것을 의미합니다. 여기에서 0xFC는 다른 비트에 중점을 둡니다. ~ 버전은 작성자가 이런 방법으로 작성하는 것이 더 좋게 느끼게 만드는 일부 플랫폼에서 약간 명확한 지침으로 직접 매핑됩니다. 그리고 ~ 버전은 버그와 실수가 적습니다. 변수의 크기를 변경하면 (코드를 움직이지 않고도) 코드가 여전히 작동합니다. 0xFC를 사용하면 코드가 손상되고 변수가 사용되는 모든 곳을 터치해야합니다. (#define을 사용하여 상수를 숨기면 디버그가 어려워집니다.정의가 재사용되었지만 손상이 이미 완료된 경우 더 좋게 만들 수 있습니다). 하루의 끝에서

당신이 가능성이 도면이나 그림 클래스에서

if(x&something) ; else { 

if((x&something)==0) { 

대 단지

if(!(x&something) { 

같은 스타일의 것은 비록 네거티브에 초점을 배울 수있는, 배경, 개체의 윤곽을 그리지 말고, objec가 아닌 것의 개요 티.

컴퓨터 공학이 있기 전에 적어도 십 년 전에 대학 (전기 공학)에서 우리는 부정적인 논리로 생각하는 것이 좋습니다. 때로는 긍정적 논리가 부정 논리를 의미하고 단 한 가지 방법만을 생각한다는 의미입니다. (같은 주장 또는 어설 션에 대한 긍정적 인 전압, VCC 및 deasserted 또는 끄기 지상입니다)

이 비트 작업을 특히 코드를 읽을 수 "나는이 비트를"제로 대 "나는 이 비트를 0으로 만들지 않습니다. " 둘 다 정확하기 때문에 스타일 차이 만 있습니다.

예를 들어 구두로 말하거나 비트 [3 : 2]가 무언가이고 0 일 때 데이터 시트에 말하면 0xF3으로 0xC를 쓰는 것만 큼 간단합니다. 두뇌가 0xC로 처리하는 스트레칭이 아니므로 0xF3으로 처리해야합니다. 길이에 대한 자세한 정보를 찾은 다음 0xF3에 도달하기 전후의 비트를 처리해야합니다. 또는 0x0C에서 머리에 0xF3을 했으므로 ~ 0x0C를 사용하여 단계를 저장할 수있었습니다. 표시된 비트가 나란히 표시된 모든 다이어그램이 있다면 유리가 반쯤 비어 있거나 반쯤 찼다면 당신과 당신의 눈은 쉽게 음수에 초점을 맞추고 0xF3을 직접 끌어 오거나 0x0C에 초점을 맞춘 다음 역으로 변환 할 수 있습니다 0xF3을 얻거나 0xF3에 초점을 맞추고 0x0C를 얻기 위해 반전해야합니다.

두 가지 장점 중 하나가 다른 것보다 덜 중요하다는 점은 소수의 프로세서에서 명령어와 직접 연결되므로 최적화 프로그램이 하드 (마이크로 최적화)로 작동하지 않아도되고 다른 하나는 소프트웨어 버그를 피하는 습관이라는 것입니다. . 몇 년 전에 int를 0xFFFFFFF3으로 사용했다면 64 비트 컴퓨터에 대한 수정없이 오늘 코드를 컴파일하여 버그에 걸릴 수 있습니다. 그 메서드가 코드 전반에 걸쳐 습관적으로 사용 되었다면 많은 이식 작업이 필요합니다. ~ 0xC가 사용 된 경우 해당 코드가 더 원활하게 이식되었을 수 있습니다. 하나는 다른 변수의 크기가 아니라는 것을 의미합니다.

1

두 값이 모두 일정하고 첫 번째 값이 계산되어 두 번째 값으로 최적화되므로 차이가 없습니다. 당신과 다른 프로그래머가 코드를 이해하기 쉽게 만드는 코드를 사용하십시오.

당신이 가변 가장 마이크로 컨트롤러의 레지스터에 변수를 작성 후 무효가이 명령을 사용하여 사용 만 등록 할 변수를 작성하는 경우에는 다른 일이 될 것이다는

3

1. 내가 처음 읽을 사용 하나는 All but 00001100이고 두 번째는 11110011입니다. 나는 비트 수가 적기 때문에 정신적으로 어떤 비트가 설정되어 있는지 이해하기가 쉽다.

+0

@Mitch Wheat 호기심에 관한 한, 영어로는 "비트 수가 적다"거나 "관용적이지 않습니까?"라고 말하는 것이 잘못 되었습니까? – Benoit

+0

이 컨텍스트에서는 올바르지 않다고 생각합니다. (그러나 기꺼이 해결할 수 있습니다!) –

+0

또한 레지스터는 8 비트 마이크로 칩의 타이머 지속 시간 레지스터처럼 실제로 카운트 다운 될 수 있습니다. –

0

일반적으로 스타일의 문제 일뿐입니다. 첫 번째는 x = ~y이며, y을 제외한 모든 비트를 x으로 설정하는 데 일반적으로 사용되는 관용구입니다.

더욱 일반적으로는 &= 연산자와 함께 사용됩니다. 예를 들어 x &= ~y은 의 비트를 지우고 y으로 설정하는 것을 의미합니다. 이 경우 쓰기가 더 읽기 쉽습니다 (예 : x &= 0xFC이 아닌 x &= ~0x40).

+0

아니요, 그건'x & = ~ y'입니다. – Benoit

+0

고마워, 나는 그 자신을 발견하고 즉시 답변을 업데이트했다. – Lindydancer

1

우선 ~는 비트 단위의 보수를 의미합니다. 이를 1의 보수와 함께 사용하지 마십시오. 16 진수를 부호있는 정수 형식으로 변환하는 방법이 있습니다.

좋은/나쁜 습관에 관해서는 "마법의 숫자"를 사용하고 있기 때문에 두 예제가 모두 좋지 않습니다. 마스크는 의미가 뭔가 및 0xF3는 어떤 임의의 매직 넘버는, 당신이 그것을 반전 한 후 이전을 사용해야하기 때문에 같은 코드를 작성하는 좋은 방법은

#define MASK 0x0C 

ANCON1 = ~MASK; 

될 것이다.

정수 상수에 사용되는 ~ 연산자는 컴파일 타임에 사전 처리됩니다. 실제 기계 코드는 여전히 LOADx $F3과 비슷합니다.

+0

칭찬 문제를 해결해 주셔서 감사합니다. 가면이 의미가 있다고 생각한다면 잠시 동안 프로그래밍을하고있을 것이고 많은 것을 이해할 것입니다. 어쩌면 무엇을해야할까요? 0b11110011 – Christian