Как представить это в Java

#java #c #bit-manipulation

#java #c #манипулирование битами

Вопрос:

 typedef struct _dmk {
       unsigned short int m     : 5;    // 0 - 31  
       unsigned short int d     : 5;    // 0 - 31  
       unsigned short int c     : 1;    // 0 - 1   
       unsigned short int i     : 5;    /* 0 - 31 */
       unsigned short int ip    : 10;   /* 0 - 1024 */
       unsigned short int mj    : 1;    // 0 - 1
       unsigned short int       : 5;    /* unused */ 
       char    msk[10];
    } DMSK;
  

Что здесь означает:? Должен ли я использовать тип данных byte или short подойдет?
Также в последнем объявлении unsigned short int имя переменной не указано. Что это значит? В чем значение 5 , 5 , 1, 5….? Пожалуйста, объясните. Спасибо

Комментарии:

1. Это битовое поле. В Java нет простого эквивалента.

2. Вы можете сгруппировать их по два short или по одному int и использовать shift и masks для реализации.

3. Проблема со многими предлагаемыми ответами (в которых в основном говорится об использовании следующего по величине целочисленного типа) заключается в том, что существует два типа этих битовых полей — те, которые сделаны, потому что программист хотел быть умным и сэкономить место, и те, которые сделаны, потому что вам нужно сделать специально для bits в аппаратном обеспечении. И это второй тип, о котором вам нужно беспокоиться.

4. Скользящий целочисленный класс является хорошим примером. Но мне нужно создать это только для битовых операций. Таким образом, int не будет хорошим вариантом.

Ответ №1:

Это битовые поля в C. Эту структуру будет практически невозможно представить в том виде, в каком она есть в Java. Вам пришлось бы написать методы для доступа к отдельным битам, хотя вы могли бы просто предоставить базовый int.

Ответ №2:

Просто используйте Java-способ, например getM() и setM() . Конечно, вам придется написать свой код.

Ваша структура описывает таблицу битов. Первые 5 битов содержат поле, m которое содержат следующие 5 битов (пересекающих границу байта) d и так далее.

JFC (Java API) не имеет реализации, которая могла бы вам помочь, поэтому, если вы часто используете подобные структуры в своей программе, я рекомендую написать класс типа SlidingInteger , который может обрабатывать одно поле. Вот так:

 class DMK {
    private static final int FIELD_M = 0;
    private static final int FIELD_D = 1;
    private static final int FIELD_C = 2;
    private static final int FIELD_I = 3;
    private static final int FIELD_IP = 4;
    private static final int FIELD_MJ = 5;
    private static final int FIELD_PLACEHOLDER1 = 6;

    private SlidingInteger[] fields;

    public DMK() {
        fields = new SlidingInteger[7];
        fields[FIELD_M] = new SlidingInteger(5);
        fields[FIELD_D] = new SlidingInteger(5);
        fields[FIELD_C] = new SlidingInteger(1);
        fields[FIELD_I] = new SlidingInteger(5);
        fields[FIELD_IP] = new SlidingInteger(10);
        fields[FIELD_MJ] = new SlidingInteger(1);
        fields[FIELD_PLACEHOLDER1] = new SlidingInteger(1);
    }

    public int getM() {
        return fields[FIELD_M].getIntValue();
    }

    public int setM(int newVal) {
        fields[FIELD_M].setIntValue(newVal);
    }

    public int getD() {
        return fields[FIELD_D].getIntValue();
    }

    public int setD(int newVal) {
        fields[FIELD_D].setIntValue(newVal);
    }
}
  

Ответ №3:

Это обозначает количество битов, которые unsigned int занимает.

Ответ №4:

Для m, d, c, i, mj вы можете использовать байтовый (максимум 8 бит) тип данных (вы также можете использовать c как логическое значение), но ip требует, по крайней мере, короткого (максимум 16 бит).

Ответ №5:

Это способ упаковки данных в определенное количество битов, чтобы, возможно, сэкономить очень небольшое количество места.

Вам пришлось бы использовать следующие более крупные типы, шириной 8 или 16 бит.

Элемент без имени — это просто явное заполнение. Указанное количество битов пропущено, и здесь оно на самом деле не нужно, поскольку следующий элемент в любом случае будет выровнен по байтам.

Ответ №6:

Структура класса из библиотеки Javolution создает то, что вам нужно (http://www.javolution.org/apidocs/index.html ?javolution/io/Struct.html ) Смотрите пример «Clock»:

  import java.nio.ByteBuffer;
 class Clock extends Struct { // Hardware clock mapped to memory.
     Unsigned16 seconds  = new Unsigned16(5); // unsigned short seconds:5
     Unsigned16 minutes  = new Unsigned16(5); // unsigned short minutes:5
     Unsigned16 hours    = new Unsigned16(4); // unsigned short hours:4
     Clock() {
         setByteBuffer(Clock.nativeBuffer(), 0);
     }
     private static native ByteBuffer nativeBuffer();
 }