Co to jest efektywny lub składnie prosty sposób na uzyskanie i ustawienie części liczb całkowitych wysokiego rzędu?C# uzyskać i ustawić słowo wysokiego rzędu z liczby całkowitej
Odpowiedz
To tak samo jak w C/C++:
// get the high order 16 bits
int high = 0x12345678 >> 16; // high = 0x1234
// set the high order 16 bits
high = (high & 0x0000FFFF) + (0x5678 << 16); // high = 0x56781234
EDIT: Bo jestem w dobrym nastroju, tutaj jesteś. Pamiętaj, że niezmienne typy są niezmienne! Funkcje "set" muszą być przypisane do czegoś.
public static class ExtensionMethods
{
public int LowWord(this int number)
{ return number & 0x0000FFFF; }
public int LowWord(this int number, int newValue)
{ return (number & 0xFFFF0000) + (newValue & 0x0000FFFF); }
public int HighWord(this int number)
{ return number & 0xFFFF0000; }
public int HighWord(this int number, int newValue)
{ return (number & 0x0000FFFF) + (newValue << 16); }
}
EDIT 2: Na drugim myśli, jeśli naprawdę trzeba to zrobić i nie chcą składnię wszędzie użyciu rozwiązanie Michaela. +1 do niego za pokazanie mi czegoś nowego.
Dzięki, szybko! –
Jeśli bardzo ich potrzebujesz i jeśli nostalgicznie spędzasz C dni, możesz stworzyć dla nich statyczne metody zwane LoWord(), HiWord(), LoByte() i HiByte(). Jestem zaskoczony, że te ekwiwalenty makroprocesorów nie były w jakiś sposób częścią jakiejś klasy .NET, takiej jak Int. – mjv
Wykorzystuje to moc obliczeniową, która jest marnotrawstwem. W czasie kompilacji pożądany wzorzec bitowy jest już gdzieś na stosie i możemy dokładnie określić kompilatorowi, gdzie znajduje się ten wzorzec bitowy, aby można go było kopiować bez żadnych obliczeń. W tym celu użyj System.BitConverter. –
zestaw:
MessageBox.Show(string.Format("{0:X}", 8 | 0x12340000));
get:
MessageBox.Show(string.Format("{0:X}", 0xDEADBEEF >> 16));
[EDIT]
C# ma doskonałe wsparcie dla zmiennych dzielących ten sam obszar pamięci i bitów strukturyzacji
źródło: http://msdn.microsoft.com/en-us/library/acxa5b99(VS.80).aspx
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace Bitwise
{
public partial class Form1 : Form
{
[StructLayout(LayoutKind.Explicit)]
struct TestUnion
{
[FieldOffset(0)]
public uint Number;
[FieldOffset(0)]
public ushort Low;
[FieldOffset(2)]
public ushort High;
}
public Form1()
{
InitializeComponent();
var x = new TestUnion { Number = 0xDEADBEEF };
MessageBox.Show(string.Format("{0:X} {1:X} {2:X}", x.Number, x.High, x.Low));
x.High = 0x1234;
MessageBox.Show(string.Format("{0:X} {1:X} {2:X}", x.Number, x.High, x.Low));
x.Low = 0x5678;
MessageBox.Show(string.Format("{0:X} {1:X} {2:X}", x.Number, x.High,
}
}
}
UWAGA: od C# nie ma makro funkcji, powyższe podejście jest bardziej wydajnych niż przechodzącą zmiennej do metody/metod rozszerzenie
+1 za DEADBEEF –
+1 za pokazanie mi czegoś nowego. Teraz mam coś nowego do nadużywania. –
Chyba nie chcesz obliczeń kiedy chcesz Hiword/Hibyte lub LoWord/Lobyte, , jeśli System.Int32 zaczyna się od adresu 100 (więc zajmuje adres 100 do 103), chcesz jako LoWord dwa bajty zaczynające się od adresu 100 i 101, a Hiword to adres 102 i 103
Można to osiągnąć za pomocą klasy BitConverter. Ta klasa nie robi nic z bitami, używa tylko adresów do zwracania żądanej wartości.
Ponieważ rozmiar typów takich jak int/long jest różny dla każdej platformy, a WORD i DWORD są nieco mylące, używam systemów typu System.Int16/Int32/Int64. Nikt nigdy nie będzie miał problemów z odgadywaniem liczby bitów w System.Int32.
Za pomocą BitConvertera można przekonwertować dowolną liczbę całkowitą na tablicę bajtów rozpoczynającą się w tej lokalizacji i przekonwertować tablicę bajtów o odpowiedniej długości na odpowiednią liczbę całkowitą. Brak obliczenia potrzebne i nie ma bitów zmieni,
Załóżmy, że masz System.Int32 X (co jest DWORD w starych warunkach)
LOWORD: System.Int16 y = BitConverter.ToInt16(BitConverter.GetBytes(x), 0);
HIWORD: System.Int16 y = BitConverter.ToInt16(BitConverter.GetBytes(x), 2);
Dobrą rzeczą jest to, że działa na wszystkich długościach, ty don Aby uzyskać trzeci bajt, trzeba połączyć funkcje takie jak LOBYTE i HIORD:
HIByte(Hiword(x)) will be like: BitConverter.GetBytes(x)[3]
Używam tych 2 funkcji ...
public static int GetHighint(long intValue)
{
return Convert.ToInt32(intValue >> 32);
}
public static int GetLowint(long intValue)
{
long tmp = intValue << 32;
return Convert.ToInt32(tmp >> 32);
}
inny alternatywny
public class Macro
{
public static short MAKEWORD(byte a, byte b)
{
return ((short)(((byte)(a & 0xff)) | ((short)((byte)(b & 0xff))) << 8));
}
public static byte LOBYTE(short a)
{
return ((byte)(a & 0xff));
}
public static byte HIBYTE(short a)
{
return ((byte)(a >> 8));
}
public static int MAKELONG(short a, short b)
{
return (((int)(a & 0xffff)) | (((int)(b & 0xffff)) << 16));
}
public static short HIWORD(int a)
{
return ((short)(a >> 16));
}
public static short LOWORD(int a)
{
return ((short)(a & 0xffff));
}
}
- 1. C/Objective-C odczytać i uzyskać ostatnią cyfrę liczby całkowitej?
- 2. C++ Sprawdzanie liczby całkowitej.
- 3. C tylko znak liczby całkowitej
- 4. ISO C++ zabrania porównywania wskaźnika i liczby całkowitej [-feprissive] | [C++]
- 5. Wykrywanie przepełnienia liczby całkowitej
- 6. Wykrywanie przepełnienia liczby całkowitej
- 7. Zaokrąglanie liczby całkowitej do najbliższej wielokrotności innej liczby całkowitej
- 8. C# - Wiązanie pola tekstowego do liczby całkowitej
- 9. C++ potęga liczby całkowitej, programowanie meta szablonów
- 10. Mnożenie liczby całkowitej, przepełnienie i utrata informacji
- 11. Dzielenie liczby całkowitej i znajdowanie największej sumy C++
- 12. Dlaczego implikacje wysokiego rzędu są w niektórych przypadkach ignorowane?
- 13. Kontrola przekroczenia liczby całkowitej SSE2
- 14. Efektywne mapowanie dla określonej skończonej liczby całkowitej ustawić
- 15. Pointer wykonana z liczby całkowitej w C na osadzonym platformy
- 16. Vimdiff: wyświetlanie całkowitej liczby zmian
- 17. Jak uniknąć przepełnienia liczby całkowitej?
- 18. Jak ustawić domyślną wartość liczby całkowitej w mongodb?
- 19. Testowanie kuriozum liczby całkowitej z operatorem modulo
- 20. Jakakolwiek różnica między funkcją pierwszej klasy a funkcją wysokiego rzędu
- 21. Binarny ciąg do liczby całkowitej z "atoi()"
- 22. Sprawdzanie poprawności liczby całkowitej z formularza
- 23. Dzielenie liczby całkowitej w Pythonie?
- 24. Mnożenie liczby całkowitej bez podpisu i bez znaku
- 25. Runda do najbliższej liczby całkowitej
- 26. Jak uzyskać 0-padded reprezentacji binarnej liczby całkowitej w java?
- 27. C: Lekarstwo na ostrzeżenie: przekroczenie liczby całkowitej w wyrażeniu?
- 28. C++ - Sprawdzanie 3 z rzędu
- 29. Znaleźć długość ciągu liczby całkowitej w .NET
- 30. Kodowanie liczby całkowitej w 7-bitowym formacie C# BinaryReader.ReadString
wielkość normalnego całkowita jest zazwyczaj długość słowa maszyny. Masz na myśli bajty o wysokim rzędzie, a może długie słowo o wysokiej kolejności? – tvanfosson