Znajdywanie w przedziale liczb które są potęgami danej liczby za pomocą operatora XOR

0

Poznaliśmy kilka operatorów logicznych, między innymi operator negacji,
alternatywy i sumy logicznej !, ||, &&. Jest jeszcze w składni konstrukcja XOR
(różnica logiczna albo alternatywa wykluczająca). Zwraca ona prawdę gdy
dokładnie jeden z warunków zwraca prawdę.
Przykładowo:
var zmienna1 = 1;
var zmienna2 = 1;
if (zmienna1 == 1 ^ zmienna2 == 1) {
//ponieważ oba warunki są spełnione, ten fragment kodu nie
zostanie
wykonany
}
var zmienna1 = 1;
var zmienna2 = 0;
if (zmienna1 == 1 ^ zmienna2 == 1) {
//ten fragment zostanie wykonany
}
Napisz dwuargumentową funkcję kwadrat_lub_szescian(a,b), która wypisze
z przedziału [a,b] wszystkie liczby całkowite, które
są kwadratem albo sześcianem jakiejś liczby całkowitej
(czyli nie są jednocześnie kwadratem i sześcianem jakichś liczb całkowitych)
Przykład wywołania:
kwadrat_lub_szescian(49,100); //49, 81, 100
funkcja nie powinna wypisać 64 bo jest kwadratem liczby 8 i sześcianem liczby 4

1

Jest jeszcze w składni konstrukcja XOR
(różnica logiczna albo alternatywa wykluczająca). Zwraca ona prawdę gdy
dokładnie jeden z warunków zwraca prawdę.
Przykładowo:
var zmienna1 = 1;
var zmienna2 = 1;
if (zmienna1 == 1 ^ zmienna2 == 1) {
//ponieważ oba warunki są spełnione, ten fragment kodu nie
zostanie
wykonany
}

to nie tak. ^ nie jest operatorem logicznym, tylko bitowym, który działa na bitach w podobny sposób jak napisałeś, ale na bitach
Czyli 5 ^ 1 będzie się równać 4, ponieważ 5 to jest 101 binarnie, więc
101
001 xor
100
czyli 4

var zmienna1 = 1;
var zmienna2 = 1;
if (zmienna1 == 1 ^ zmienna2 == 1) {

To, że to działa (true ^ true), wynika ze słabego typowania. W języku silnie typowanym by to się nie kompilowało nawet.

Przy czym należy oddzielić koncepcję prawda/fałsz w kontekście bitów (gdzie 1 to "prawda", 0 to "fałsz") od wartości logicznych w językach programowania (czyli true, false, to na podstawie czego ify działają. Przy czym w językach słabo typowanych (jak JS) można dać np. coś takiego

var zmienna1 = 1
var zmienna2 = 123
if (zmienna1) {
} 
if (zmienna2) {
}
if (123) {
}

w języku silnie typowanym byłby to błąd kompilacji, że dajesz liczbę do ifa zamiast booleana i należałoby napisać faktyczny warunek, np.:

if (zmienna1 != 0) {
}

w JS automatycznie się to konwertuje do true/false https://developer.mozilla.org/en-US/docs/Glossary/Truthy
z kolei true/false się automatycznie konwertuje do 1/0, dlatego to działa w JS: zmienna1 == 1 ^ zmienna2 == 1, bo zmienna1 == 1 daje true, ale konwertuje się automatycznie do 1, i drugi warunek tak samo. więc masz true ^ true, a wartości true w JS się konwertują do 1. Więc nie masz już logiki, a zwykłe 1 ^ 1

Czyli słabe typowanie zamydla obraz i sprawia, że może się wydawać, że XOR jest operatorem logicznym, a tak nie jest.

0

Szczerze mówiąc nie widzę, jak zastosować XOR do zadania, ma w ogóle nie pasujące właściwości.

0

no jak się weźmie ^ do ifa korzystając ze słabego typowania (że się zamieni true/false na 1/0), to faktycznie można będzie sprawdzić czy jeden z dwóch warunków jest spełniony (są kwadratem albo sześcianem jakiejś liczby całkowitej (czyli nie są jednocześnie kwadratem i sześcianem jakichś liczb całkowitych)

function f(a, b) {
	for (let i = a; i <= b; i++) {
			if (Number.isInteger(Math.sqrt(i)) ^ Number.isInteger(Math.cbrt(i))) {
			console.log(i)
		}
	}
}```
gdzie Math.sqrt to pierwiastek kwadratowy, Math.cbrt sześcienny.

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