Выделение памяти в C против Java - PullRequest
0 голосов
/ 11 апреля 2020

Я пытаюсь выяснить, является ли число четным или нечетным, не используя операцию модуля. Согласно моему пониманию, когда я определяю int в C или в Java, это число сохраняется как 64 байта памяти. Я могу получить доступ к нулевому (0-му) биту этого числа, используя квадратные скобки [].

Однако я не могу сделать это в Java.

Итак, мой вопрос в том, как память Распределение и синтаксис отличается в Java?

Ответы [ 3 ]

2 голосов
/ 12 апреля 2020

Это на самом деле не имеет ничего общего с «памятью» или «выделением памяти». Вы говорите о простом свойстве числа.

В двоичном коде младший значащий бит числа равен 1, если число нечетное, или 0, если число четное. Хорошо, как мы изолируем нижний бит? Ответом является операция 'и', выраженная в C и Java как '&'.

  boolean isEven = (number & 1) == 0;  
  boolean isOdd = (number & 1) != 0;  

Кстати, в C

  • Целое число определенно не занимает 64 байта. Может быть, 64 бита, в зависимости от компьютера, реализации C и т. Д. c.

  • При наличии одного целого числа скобки не дают вам доступ на битовом уровне. Скобки предназначены для индексации массива: т. Е. Для выделения N-го числа в массиве чисел.

1 голос
/ 11 апреля 2020

Вы не можете получить доступ к памяти в Java, как вы можете в C

Однако вы можете использовать побитовый оператор &, чтобы выбрать один или несколько битов целочисленного значения. Если вы сделаете это для бита, соответствующего четному / нечетному, и увидите, равен ли результат нулю или нет, вы получите ответ без использования модуля

0 голосов
/ 12 апреля 2020

Вы не можете получить доступ к отдельным битам целочисленного типа в C или Java, используя оператор []. Операндом оператора [] должен быть тип массива (C и Java) или тип указателя (C).

Целочисленные типы в C и Java ведут себя аналогично , хотя целочисленные типы в Java имеют фиксированный размер (C целочисленные типы имеют минимальный размер). В обоих языках целочисленные типы размещаются одинаково.

Что касается тестирования нечетных / четных целых чисел без использования побитовых операций (которые могут иметь проблемы с порядком байтов) или оператора модуля, вы можете воспользоваться целочисленной арифметикой c.

В обоих C и Java деление целого числа на целое дает целочисленный результат. 3/2 == 1, а не 1.5. 100/26 == 3 и др. c. Таким образом, если вы разделите исходное значение на 2, а затем умножите этот результат на 2, вы получите исходное значение обратно, только если исходное значение четное:

3 / 2 == 1, 1 * 2 == 2, 2 != 3 
4 / 2 == 2, 2 * 2 == 4, 4 == 4
5 / 2 == 2, 2 * 2 == 4, 4 != 5

Вы поняли идею. Итак,

int tmp = x / 2;
if ( x == tmp * 2 )
  // x is even
else
  // x is odd
...