Существует инструкция сборки x86 ( bsf
), которая сделает это. :)
Больше оптимизировано?!
Оптимизация на этом уровне по своей природе зависит от архитектуры. Сегодняшние процессоры слишком сложны (с точки зрения предсказания ветвлений, промахов кэш-памяти, конвейерной обработки), что так сложно предсказать, какой код выполняется быстрее, на какой архитектуре. Уменьшение операций с 32 до 9 или подобное может даже снизить производительность на некоторых архитектурах. Оптимизированный код в одной архитектуре может привести к ухудшению кода в другом. Я думаю, вы бы либо оптимизировали это для конкретного процессора, либо оставили его таким, каким он есть, и пусть компилятор выбирает то, что, по его мнению, лучше.
Я бы сделал что-то вроде:
[XmlIgnore] public Bitmap LargeIcon {get; задавать; } [Browsable (false), EditorBrowsable (EditorBrowsableState.Never)] [XmlElement («LargeIcon»)] public byte [] LargeIconSerialized {get {// сериализовать if (LargeIcon == null) возвращает значение null; используя (MemoryStream ms = new MemoryStream ()) {LargeIcon.Save (ms, ImageFormat.Bmp); return ms.ToArray (); }} set {// deserialize if (value == null) {LargeIcon = null; } else {using (MemoryStream ms = новый MemoryStream (значение)) {LargeIcon = новый битмап (мс); }}}}
Внесите IXmlSerializable
, а затем обработайте все детали сериализации самостоятельно.
Поскольку вы говорите, что это большой тип, и у вас есть только проблема с растровым изображением, подумайте о том, чтобы сделать что-то вроде этого:
общедоступный класс BitmapContainer: IXmlSerializable {public BitmapContainer () {} общедоступный Bitmap Data {get; задавать; } public XmlSchema GetSchema () {throw new NotImplementedException (); } public void ReadXml (XmlReader reader) {throw new NotImplementedException (); } public void WriteXml (XmlWriter writer) {throw new NotImplementedException (); }} public class TypeWithBitmap {public BitmapContainer MyImage {get; задавать; } public string Имя {get; задавать; }}
Класс BitMap не был разработан для простого XML-сериализации. Итак, нет, нет простого способа исправить дизайнерское решение.
Вы также можете реализовать ISerializable
и использовать SerializationInfo
для ручного управления содержимым вашего растрового изображения.
EDIT: João прав: Правильный путь для обработки сериализации XML заключается в реализации IXmlSerializable
, а не ISerializable
:
public class MyImage: IXmlSerializable {public string Name {get; задавать; } public Bitmap Image {get; задавать; } public System.Xml.Schema.XmlSchema GetSchema () {throw new NotImplementedException (); } public void ReadXml (System.Xml.XmlReader reader) {throw new NotImplementedException (); } public void WriteXml (System.Xml.XmlWriter writer) {writer.WriteStartElement («Имя»); writer.WriteString (this.Name); writer.WriteEndElement (); используя (MemoryStream ms = новый MemoryStream ()) {this.Image.Save (ms, ImageFormat.Bmp); byte [] bitmapData = ms.ToArray (); writer.WriteStartElement ( "Изображение"); writer.WriteBase64 (bitmapData, 0, bitmapData.Length); writer.WriteEndElement (); }}}
XmlSerializer
. РеализацияIXmlSerializable
требует боли. – Marc Gravell♦ 15 December 2009 в 13:47