C# Bit Shifting

S

Struct

Gast
Hallo zusammen

ich habe ein sehr sehr dringendes Problem, ohne das ich heute nicht weiter komme und morgen habe ich eine Präsentation.
Kennt sich jemand von euch mit Bit-Shifting bei C# aus?

Ich habe einen Byte scaleValue mit dem Wert 2 (0000.0010 binary)

Jetzt möchte ich das Bit 3 und 4 (Scale) der Byte Config (siehe Bild) mit Hilfe meines Byte scaleValue setzen, aber es funktioniert nicht.

Code:
Byte configByte = (configByte | (scaleValue<< 0x02));

photo_2018-01-21_20-59-03.jpg
 
Byte configByte |= 2^3 + 2^4;
oder
Byte configByte |= 3<<3;

Ein Bit setzen:

Byte configByte |= 2^bitnumber;
oder
Byte configByte |= 1<<bitnumber;
 
Zuletzt bearbeitet:
Also so?

Code:
using System;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            Byte b = 0b0000_0010;   /* needs c# 7 I think */
            Byte configByte = 0x00;

            Console.WriteLine("configByte's value before is 0x{0}", Convert.ToString(configByte, 2));

            configByte = (Byte)(configByte | (b << 0x02));

            Console.WriteLine("configByte's value after is 0x{0}",  Convert.ToString(configByte, 2) );
        }
    }
}

Du musst den typecast auf Byte angeben, nach der binaeren Operation.
So 100% ist nicht klar, was denn das Problem ist..
 
Guten Tag,

vielleicht etwas doof erklärt. Ich versuch es nochmal. Habe ein Byte namens configByte (siehe Bild). Dort soll z.B. das 3 und 4. Bit gesetzt werden.

Das Bit soll anhand eines bereits vorhandenen Wertes gesetzt werden.

Der vorhandene Wert ist das Byte scaleValue. Nehmen wir besser an es hat den Wert 3, also 0000.00011. Dieser Wert, also die ersten beiden Bits, sollen in das configByte an die Stelle Scale geschoben werden.

scaleValue = 3 = 0000.0011

Vorher: configByte = 0 = 0000.0000
Nachher: configByte = 24 = 0001.1000
 
Zuletzt bearbeitet:
Muß es Bitzugriff sein?

Das ist C#, eine Hochsprache, wo man an Bits nur recht schwer rankommt. Dafür gibt es aber Objekte, zB eben auch Object Config mit den Eigenschaften Scale, Precision und Size, die man unabhängig voneinander setzen und zuordnen kann (und die dann natürlich auch entsprechend zu verwenden gehen).

Der ganze Rest erübrigt sich dann.

Wenn nicht grad Bits ein zentrales Thema sind, würd ich das insbesondere für C# komplett außen vorlassen.


Übrigens ist das auch kein Bitshifting: Bitshifting ist buchstäblich genau das, nämlich links oder rechts reinschieben und das Bit am anderen Ende fällt raus. Das ist eine simple binäre ODER-Operation.

ConfigByte ist damit an dieser Stelle nichts anderes als ConfigByte | scaleValue, wobei damit jedoch existierende Bits insbesondere in ##3 und 4 nicht gelöscht werden.

Sinnvoll wäre daher ggf eine Initialisierung von ##3 und 4 auf 0, bevor man weitermacht. Dazu ein binäres UND, welches alle gesetzten Bits außer 3 und 4 in Ruhe läßt: 0xE7 & configByte.
 
Gut, also nimm das Programm was ich oben stehen habe, und aendere den bit shift wert von 0x02 auf 0x03 (oder halt dezimal 3 :) ) und das ist's doch dann, oder?
 
Zurück
Oben