variable utiliza tipo sintaxis que programacion para negativo example caracteristicas c# integer bit-manipulation

c# - utiliza - que es int en programacion



Número mínimo de bytes que puede contener un valor entero (2)

Dado un valor entero, necesito alguna forma de averiguar el número mínimo de bytes necesarios para almacenar el valor. El valor puede estar firmado o sin firmar, hasta 64 bits . Además, tenga en cuenta el bit de signo para los enteros con signo.

Por ejemplo:

8 requires 1 byte at minimum unsigned 255 requires 1 byte at minimum signed 255 requires 2 bytes at minimum 4351 requires 2 bytes at minimum -4294967296 requires 5 bytes at minimum unsigned 0xFFFFFFFFFFFFFFFF requires 8 bytes at minimum

Puedo pensar en una manera rápida y sucia de resolver esto, usando muchas declaraciones if, pero podría haber mejores (por ejemplo, más simples, más inteligentes, más rápidas) formas de hacerlo. Puede suponer un método con firma int (long value, bool signed) o dos métodos int (long value) (para firmado) e int (ulong value) (para unsigned).


Déjame probar mi propia pregunta. Por lo que puedo decir, esta es una solución correcta, pero puede no ser óptima en velocidad, concisión:

public static int GetMinByteSize(long value, bool signed) { ulong v = (ulong)value; // Invert the value when it is negative. if (signed && value < 0) v = ~v; // The minimum length is 1. int length = 1; // Is there any bit set in the upper half? // Move them to the lower half and try again. if ((v & 0xFFFFFFFF00000000) != 0) { length += 4; v >>= 32; } if ((v & 0xFFFF0000) != 0) { length += 2; v >>= 16; } if ((v & 0xFF00) != 0) { length += 1; v >>= 8; } // We have at most 8 bits left. // Is the most significant bit set (or cleared for a negative number), // then we need an extra byte for the sign bit. if (signed && (v & 0x80) != 0) length++; return length; }


static int BytesForNum(long value, bool signed) { if (value == 0) return 1; if (signed) { if (value < 0) return CalcBytes(2 * (-1-value)); else return CalcBytes(2 * value); } else { if (value < 0) throw new ArgumentException("Can''t represent a negative unsigned number", "value"); return CalcBytes(value); } } //should only be called with positive numbers private static int CalcBytes(long value) { int bitLength = 0; while (value > 0) { bitLength++; value >>= 1; } return (int)(Math.Ceiling(bitLength * 1.0 / 8)); }

Puede que no tenga el código firmado correctamente, pero esa es la idea general.