Operacje na bitach - pomoc z programem

0

Operacje na bitach:
Napisać metodę, która zwraca tablicę pozycji na których znajdują się bity jedynkowe w liczbie typu int przekazanej jako argument metody.

Witam, Powyżej jest treść zadania, które mam wykonać.
Niby krótkie i tak dalej, ale nie wiem jak się do tego zabrać.
Pewnie zadanie jest oczywiste, ale naprawdę nie wiem jak to rozgryźć.
Dodam, że dopiero zaczynam przygodę z tablicami dlatego proszę o wyrozumiałość i w miarę proste tłumaczenie, wręcz 'łopatologiczne'.
Z góry dziękuję.

1
for(int pos=1;Liczba!=0;++pos,Liczba>>=1) if(Liczba&1!=0)  ; // w pozycji pos mamy 1-kę
0

Łatwiejsza wersja z pozycjami liczonymi od prawej:

int n = 24; // Argument funkcji
int nlen = 0; // Liczba bitów w binarnej reprezentacji n
List<Integer> pos = new LinkedList<>();
for (int i = 1; n >> i != 0; i++)
    nlen = i + 1;
for (int i = 0; i < nlen; i++)
    if ((n & (1 << i)) != 0) // "1 << i" to kolejno 1, 2, 4, 8...
        pos.add(i);
return pos.toArray(new Integer[pos.size()]);
0

Dziękuję za pomoc, jednak mam jeszcze parę pytań...


List<Integer> pos = new LinkedList<>();

return pos.toArray(new Integer[pos.size()]);
 

Proszę o wyjaśnienie tych dwóch linijek. Dlaczego Integer jest zapisany w <> ? Tak samo LinkedList<>.

I jeśli chcę by program pokazał okno z wynikiem to piszę po prostu:

JOptionPane.showMessageDialog(null,pos.toArray());

?

0

Wiem, że to pewnie głupie pytanie, ale właściwie gdzie w tym kodzie jest tablica?
Uczyłem się, że tablice zapisuje się np. w taki sposób:

	int ltab[] = {1, 2, 3, 4, 5}; 
        tablica newTablica = new tablica();

i tak dalej.

Czy wzorując się na tym nie powinno być coś takiego:

 	
LinkedList pos = new LinkedList();
		

?
Czy może źle to rozumiem?

0

w kodzie @michat nie ma tablicy jest LinkedList - co to jest przeczytasz w dokumentacji metoda toArray zamienia listę na tablicę. a po co są te nawiasy ostre dowiesz się po przeczytaniu informacji o generykach

0
szopenfx napisał(a):

w kodzie @michat nie ma tablicy jest LinkedList - co to jest przeczytasz w dokumentacji metoda toArray zamienia listę na tablicę. a po co są te nawiasy ostre dowiesz się po przeczytaniu informacji o generykach

Już rozumiem, przez ostre nawiasy podajemy konkretny typ, w tym przypadku integer.
Z tego co wyczytałem, to do takiego ArrayList czy LinkedList potem dodajemy elementy do listy przed add(jakiś obiekt).
w kodzie wyżej jest to i.
A mimo to przy kompilacji wyskakuje błąd:

 error: type List does not take parameters
		List<Integer> pos = new LinkedList<>();

oraz

error: cannot return a value from method whose result type is void
				return pos.toArray(new Integer[pos.size()]);
0

cannot return a value from method whose result type is void po prostu zwróć typ taki jaki chcesz czyli tą tablice intów a nie void. Co do 1 nie jestem związany z Javą więc tu może ktoś inny się wypowie, ale spróbuj tak: List<Integer> pos = new LinkedList<Integer>(); lub LinkedList<Integer> pos = new LinkedList<Integer>();

0
szopenfx napisał(a):

cannot return a value from method whose result type is void po prostu zwróć typ taki jaki chcesz czyli tą tablice intów a nie void. Co do 1 nie jestem związany z Javą więc tu może ktoś inny się wypowie, ale spróbuj tak: List<Integer> pos = new LinkedList<Integer>(); lub LinkedList<Integer> pos = new LinkedList<Integer>();

Pierwszy error pojawia się dalej mimo zmiany. Także to nie pomogło niestety :(

A co do drugiego to nie bardzo rozumiem.
Mógłby ktoś pokazać jak to powinno wyglądać w kodzie?

0

Na Ideone działa taki kod: http://ideone.com/8BDjSd dlaczego nie działa u ciebie to już może ktoś inny ci powie.

0

Jakby co to korzystam z JCreatora.
Także będę wdzięczny jeśli ktoś wyjaśni te errory i dlaczego w tym programie nie chce zadziałać.

0
import java.util.*;
import java.lang.*;
import java.io.*;
 

class Main{
	
		public static void main(String[] args) {
			
	int n = 24; 
	int nbit = 0; 
	
	List<Integer> pos = new LinkedList<>();

		for (int i = 1; n >> i != 0; i++)
   		nbit = i + 1;
		for (int i = 0; i < nbit; i++)
   			 if ((n & (1 << i)) != 0) pos.add(i);
   			 
		return pos.toArray(new Integer[pos.size()]);
		
		
		System.out.println(pos.Array());
	}
}	 

Z resztą jak wkleję ten kod: http://ideone.com/8BDjSd
jest ten sam error co pisałem wyżej.

0

Kod jest raczej bez sensu:

  • skoro funkcja main zwraca typ void (tzn, niczego nie zwraca), to nie może zawierać instrukcji postaci return jakaś_wartość,
  • kompilator javy nie pozwala na umieszczanie kodu, który nigdy się nie wykona, w szczególności nie może być kodu po instrukcji return.
0
import java.util.*;
import javax.swing.*;

public class Bit {

    public static void main(String[] args) {
        // Pobranie od uzytkownika liczby
        System.out.print("Podaj liczbe: ");
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        // Wyliczenie pozycji z 'zapalonymi' bitami
        Integer[] positions = getPositions(n);
        // Wyświetlenie pozycji (tekstowo)
        System.out.println(Arrays.toString(positions));
        // Wyświetlenie pozycji (graficznie)
        JOptionPane.showMessageDialog(null, Arrays.toString(positions));
    }

    public static Integer[] getPositions(int n) {
        int nlen = 0; // Liczba bitów w binarnej reprezentacji n
        List<Integer> pos = new LinkedList<>(); // Lista pozycji
        for (int i = 1; n >> i != 0; i++)
            nlen = i + 1;
        for (int i = 0; i < nlen; i++)
            if ((n & (1 << i)) != 0)
                pos.add(i); // Dodanie  do listy
        return pos.toArray(new Integer[pos.size()]); // Zamiana listy na tablicę
    }
}

Ten kod umieszczasz w pliku o nazwie Bit.java
Kompilujesz poleceniem javac Bit.java
Uruchamiasz poleceniem java Bit

Przypominam ze pozycje liczone sa od prawej strony, zaczynajac od 0

0

Zrobiłem tak jak napisałeś, skompilowałem i tak dalej, a mimo to jest error:

 
error: type List does not take parameters
        List<Integer> pos = new LinkedList<>(); // Lista pozycji
0

Zamień w takim razie

List<Integer> pos = new LinkedList<>();

na

List<Integer> pos = new LinkedList<Integer>();

Możliwe że masz starszą wersję Javy która nie obsługuje diamond operatora

0

Niestety dalej pojawia się ten błąd..
Jest możliwość jakiejś zmiany kodu by to działało? Być może mam starszą wersję, ale nie wiem czy na niej tez się uda to zrobić. Nawet w jakiś inny sposób.

0
 
Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
	Syntax error, parameterized types are only available if source level is 1.5 or greater
	Syntax error, parameterized types are only available if source level is 1.5 or greater
	The method add(int, Integer) in the type List<Integer> is not applicable for the arguments (int)
	Type mismatch: cannot convert from T[] to Integer[]

	at Bit.getPositions(Bit.java:19)
	at Bit.main(Bit.java:10)


Próbuję w Eclipse (pierwszy raz używam, dopiero pobrane). Tu z kolei pojawia się taka informacja jak wyżej.

0

Upewnij się, że masz dokładnie:

import java.util.List;

ewentualnie daj: import java.util.*;

0

PPM na projekcie => Properties =>Java Compiler => Compiler compliance level, wybierz jakąś nową wersję nową (1.5 co najmniej).
Żeby mieć spokój w przyszłości zrób to samo w Window => Preferences => Java => Compiler.

1 użytkowników online, w tym zalogowanych: 0, gości: 1