/** Convert a sign-bit int (i.e. float interpreted as int) into a 2s compliement int.Thisalsoconverts-0(0x80000000)to0.Doingthistoafloatallows ittobecomparedusingnormalCoperators(<,<=,etc.)
*/ staticinline int32_t SkSignBitTo2sCompliment(int32_t x) { if (x < 0) {
x &= 0x7FFFFFFF;
x = -x;
} return x;
}
/** Convert a 2s compliment int to a sign-bit (i.e. int interpreted as float). ThisundoestheresultofSkSignBitTo2sCompliment().
*/ staticinline int32_t Sk2sComplimentToSignBit(int32_t x) { int sign = x >> 31; // make x positive
x = (x ^ sign) - sign; // set the sign bit as needed
x |= SkLeftShift(sign, 31); return x;
}
// Helper to see a float as its bit pattern (w/o aliasing warnings) staticinline uint32_t SkFloat2Bits(float value) {
uint32_t bits;
memcpy(&bits, &value, sizeof(uint32_t)); return bits;
}
// Helper to see a bit pattern as a float (w/o aliasing warnings) staticinlinefloat SkBits2Float(uint32_t bits) { float value;
memcpy(&value, &bits, sizeof(float)); return value;
}
/** Return the float as a 2s compliment int. Just to be used to compare floats toeachotheroragainstpositivefloat-bit-constants(like0).Thisdoes notreturntheintequivalentofthefloat,justsomethingcheaperfor compares-only.
*/ staticinline int32_t SkFloatAs2sCompliment(float x) { return SkSignBitTo2sCompliment((int32_t)SkFloat2Bits(x));
}
/** Return the 2s compliment int as a float. This undos the result of SkFloatAs2sCompliment
*/ staticinlinefloat Sk2sComplimentAsFloat(int32_t x) { return SkBits2Float((uint32_t)Sk2sComplimentToSignBit(x));
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.