Преобразование из C ++ в Java (возвращение более одного значения в Java) - PullRequest
2 голосов
/ 08 апреля 2011
Not getting the char value: 
#define XL 33 
#define OR 113 
#define NOR 313 
#define TN 344 

int to_bits(int critn,char *mask) 
{ 
unsigned int x; 
int begin; 

if (critn < XL) begin = 1; 
else if (critn < OR) begin = XL; 
else if (critn < NOR) begin = OR; 
else if (critn <= TN) begin = NOR; 
else begin = 0; 
x = critn - begin; 

*mask = (char)(0x80 >> (x % 8)); 

return (int)(x >> 3); // fast divide by 8 
}

Пояснения и пример метода см. Объясните следующий метод C ++ .

Я написал следующий метод на Java:

ClassA{

final static int xl = 33;
final static int or = 113;
final static int nor = 313;
final static int tn = 344;

public int to_bits(int critn){
    int x;
    int begin;

    if(critn<xl)
     begin = 1;
    else if (critn<or) 
     begin = xl;
    else if (critn<nor)
     begin = or;
    else if (critn<tn) 
     begin = nor;
    else begin = 0;

     x = critn - begin;

    char mask = (char)(0x80 >> (x % 8));
    System.out.println(mask);

    return (int)(x >> 3);

}


public static void main(String args[]){
    ClassA a =new ClassA();
    a.to_bits(312);

}

}

Можем ли мы взять вывод маски в объект Bitset. Я выхожу как (специальный вывод для поля char)

24.

Пожалуйста, предложите также, как получить символьные и целочисленные значения. спасибо

Ответы [ 3 ]

2 голосов
/ 08 апреля 2011

Вы спрашиваете, можете ли вы вывести маску в двоичном виде?

Если это так, это сделает работу:

    System.out.println(Integer.toBinaryString(mask));

или в шестнадцатеричном формате:

    System.out.println(Integer.toHexString(mask));

( РЕДАКТИРОВАТЬ - я ранее говорил, что должен использовать Integer.toString(mask, 2 /* or 16 */), но это форматирует число как подписанное ... что, очевидно, сбивает вас с толку.)


В конечном итоге вы такжехочу знать, чтобы возвращать более одного значения из вызова метода Java.Ответ - вернуть значения в массиве (или объекте);например,

    return new int[]{(char)(0x80 >> (x % 8)), x >> 3});

или установить их в изменяемый массив или объект, переданный в качестве параметра.


У меня такое ощущение, что вы не поняли, что char является 16-битнымвведите в Java.Если вы хотите, чтобы тип был эквивалентен C / C ++ char, самым близким является тип Java byte - 8-битный тип со знаком.


При дальнейшем рассмотрении самый простой подходсделать расчеты, чтобы дать вам int значений;например,

    return new int[]{0x80 >> (x % 8), x >> 3});

, и вызывающая сторона преобразует любое значение в какой-либо другой тип , если требуется .

Предполагая, что эти значения предназначены для использования в побитовом режиме,тот факт, что они могут выглядеть отрицательно, не имеет значения ... при условии, что битовые комбинации верны.Помните, что это битовые комбинации, а не числа.Если это сбивает с толку, используйте Integer.toHexString(...) или Integer.toBinaryString(...), чтобы распечатать их в неподписанном виде.

0 голосов
/ 08 апреля 2011

Краткий ответ: Нет способа вернуть более одного значения.

Длинный ответ: Вы можете поместить более одного значения в одно значение.Если вы хотите вернуть только несколько значений и все ваши значения имеют одинаковый тип, используйте массив.(см. ответ Стивена С.) В противном случае используйте объект.Для вашего случая:

class MaskAndBits {
      char mask;
      int bits;
      public BitsAndMask(char mask, int bits) {
        this.mask = mask;
        this.bits = bits;
      }
 }

, а затем return new Whatever((char)(0x80 >> (x % 8));, (int)(x >> 3)).В целом, это гораздо больше, чем решение для массива, но сложнее смешать два возвращаемых значения; -)

0 голосов
/ 08 апреля 2011

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

// char mask = (char) (0x80 >> (x% 8));байтовая маска = (байт) (0x80 >> (x% 8));System.out.println (Integer.toString (mask, 2));

вывод: 1 24

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...