클래스 할당 작업 중 비트 처리를 사용하여 부동 소수점으로 캐스팅하려고합니다 (|/| & &. 또한, while). 내 코드는 대부분의 값에서 작동하지만 일부 값은 내가 찾고있는 결과를 생성하지 않습니다.비트 조작을 사용하여 부동 소수점 형을 사용하여 부동 소수점 형을 사용하는 부동 소수점 숫자로 변환
예를 들어 x가 0x807fffff이면 0xceff0001이 표시되지만 올바른 결과는 0xceff0000이어야합니다. 내 가수와 반올림으로 뭔가를 놓친 것 같아요,하지만 그것을 확실히 고정시킬 수는 없습니다. 나는 SO뿐만 아니라 일부 다른 스레드 검토 한 converting-int-to-float 및 how-to-manually
unsigned dl22(int x) {
int tmin = 0x1 << 31;
int tmax = ~tmin;
unsigned signBit = 0;
unsigned exponent;
unsigned mantissa;
int bias = 127;
if (x == 0) {
return 0;
}
if (x == tmin) {
return 0xcf << 24;
}
if (x < 0) {
signBit = x & tmin;
x = (~x + 1);
}
exponent = bias + 31;
while ((x & tmin) == 0) {
exponent--;
x <<= 1;
}
exponent <<= 23;
int mantissaMask = ~(tmin >> 8);
mantissa = (x >> 8) & mantissaMask;
return (signBit | exponent | mantissa);
}
EDIT/UPDATE 가능한 솔루션을 찾을 - 당신의 코드 예제에 나를 위해 예상되는 출력을 생성
"비트 연산 만 사용"이라는 이상한 정의가 있습니다. 관계형 연산과 산술 연산도 코드에서 볼 수 있습니다. (그리고 단순하고 복합적인 대입 연산도 있지만, 할당을 배제하려는 것은 아닙니다.) –
관계형 비교기와 정수 및 부호없는 곱셈은 허용되지만 형변환은 허용되지 않습니다 (if/while 루프 사용 가능) –
참고 :'0x1 << 31'은 작동하지 않을지라도 정의되지 않은 동작입니다. – chux