X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Flib%2Fbits.qh;h=de11eef412154af108c93b92d6dd5c1768b84ea3;hb=b1317ceb61ee2690d3d892945c1c0926c181db2b;hp=0e07cb43e69d8a1e849f4301b26a359101565087;hpb=6b074c60f766cd9f4b2207a95e6ececfa0dd8f54;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/lib/bits.qh b/qcsrc/lib/bits.qh index 0e07cb43e..de11eef41 100644 --- a/qcsrc/lib/bits.qh +++ b/qcsrc/lib/bits.qh @@ -2,6 +2,9 @@ #include "log.qh" +/// Only ever assign into the first 24 bits in QC (so max is BIT(23)). +/// QC converts the float to int, performs the bit operation, then converts it back. +/// Assigning to the highest bits means some of the low ones might get lost due to float precision. #define BIT(n) (1 << (n)) #define BITS(n) (BIT(n) - 1) #ifndef BRANCHLESS_BITSET @@ -10,6 +13,7 @@ #define BITSET(var, mask, flag) ((var) ^ (-(flag) ^ (var)) & (mask)) #endif +ERASEABLE int lowestbit(int f) { f &= ~(f << 1); @@ -20,6 +24,7 @@ int lowestbit(int f) return f; } +ERASEABLE int randombit(int bits) { if (!(bits & (bits - 1))) // this ONLY holds for powers of two! @@ -42,6 +47,7 @@ int randombit(int bits) return b; } +ERASEABLE int randombits(int bits, int k, bool error_return) { int r = 0; @@ -75,6 +81,7 @@ enum { OP_MINUS }; +ERASEABLE bool GiveBit(entity e, .int fld, int bit, int op, int val) { int v0 = (e.(fld) & bit); @@ -99,6 +106,7 @@ bool GiveBit(entity e, .int fld, int bit, int op, int val) return v0 != v1; } +ERASEABLE bool GiveValue(entity e, .int fld, int op, int val) { int v0 = e.(fld);