2016-05-02 2 views
-2

мин: 6 бит res1: 1 бит IV: 1 битБитовые поля шалить в структуре C#

Все в структуры выглядит здорово, но я не получить ожидаемый результат!

struct cp56time2a 
{ 

    internal byte cp56time2a_data1; 


    public byte min 
    { 
     get { return (byte)(cp56time2a_data1 & 0x3f); } 
     set { cp56time2a_data1 = (byte)((cp56time2a_data1 & ~0x3f) | (value & 0x3f)); } 
    }           //min :6; 0..59 
    public byte res1 
    { 
     get  { return (byte)((cp56time2a_data1 >> 6) & 0x01); } 
     set  { cp56time2a_data1 = (byte)((cp56time2a_data1 & ~(0x01 << 6)) | (value & 0x01) << 6); } 
    } 
    public byte iv 
    { 
     get  { return (byte)((cp56time2a_data1 >> 7) & 0x01); } 
     set  { cp56time2a_data1 = (byte)((cp56time2a_data1 & ~(0x01 << 7)) | (value & 0x01) << 7); } 
    }   
}  

Я пытался присвоить это значение каждого из полей структуры: 0x55 = 0 1 010101

Простой код теста:

 T.min = 0x55 ;  
     Console.WriteLine("min = {0}", T.min); 
     Console.WriteLine("res1 = {0}", T.res1); 
     Console.WriteLine("iv = {0}", T.iv); 
     Console.WriteLine("cp56time2a_data1 = {0}",T.cp56time2a_data1); 

     T.res1 = 0x55 ; 
     Console.WriteLine("min = {0}", T.min); 
     Console.WriteLine("res1 = {0}", T.res1); 
     Console.WriteLine("iv = {0}", T.iv); 
     Console.WriteLine("cp56time2a_data1 = {0}", T.cp56time2a_data1); 

     T.iv = 0x55 ; 
     Console.WriteLine("min = {0}", T.min); 
     Console.WriteLine("res1 = {0}", T.res1); 
     Console.WriteLine("iv = {0}", T.iv); 
     Console.WriteLine("cp56time2a_data1 = {0}", T.cp56time2a_data1);` 

который, как ожидается, чтобы показать: min =21 || res1 = 1 || iv = 0

, но это то, что я получаю: enter image description here

Внутренний байт структуры является неправильным. ВАШИ ИДЕИ ПОЖАЛУЙСТА!

+0

Какой смысл делать 'res1' и' iv' 'byte' вместо' bool'? Может только когда-либо представлять '1' или' 0'. Присвоение им '0x55' вводит в заблуждение. – Rotem

+2

Все результаты верны. Ничего плохого. Можете ли вы объяснить, почему вы считаете, что они неправы? Почему вы ожидаете, что он покажет, что res1 = 1 ** до ** вы назначаете res1? Вы никогда ничего не назначаете, чтобы он оставался нолем! Когда вы что-то присваиваете ему - младший бит 0x55 - он изменяется на 1. –

+0

@Rotem у меня есть тонны байтов для чтения из буферов, и я не хочу делать маски и перемещаться внутри функций. Кроме того, у меня есть подобные структуры, которые состоят из нескольких 1 | 2 | 3 | 4 | 5 бит (-ов) последовательности: так что я не усложняю вещи .. –

ответ

1

Для двух свойств res1 и iv у вас есть следующее: value & 0x01 Другими словами, вы принимаете только младший значащий бит значения, присвоенного этим свойствам.

Также, когда вы читаете эти свойства, вы делаете это: & 0x01. Поэтому довольно очевидно, что эти свойства предназначены для чтения и записи одного бита, то есть они являются 0 или 1.

+0

вы правы. Спасибо приятель . –

+0

res1: 'value & 0x40' iv: 'value & 0x80'. это должно исправить это. –

Смежные вопросы