if (result==0)
result = tempResult;
else
if ( (result & tempResult) !=0)
result*=tempResult;
1. У меня вопрос по поводу применения энда
Если мы сделаем
System.out.println((5 & 5) + " " + (7 & 6));
,
то вывод будет 5 6.
Что достаточно логично. побитовое умножение будет действовать так
0101 & 0101 = 0101
0111 & 0110 = 0110
А вот если взять 8 и 6, то получим 0
1000 & 0110 = 0
то есть побитовый энд не даёт верных результатов, которые бы показывали, что result и tempResult равны. Вопрос. Наверное, что-то надо подправить?
2. После проверки первого условия никак не проверяется — tempResult == 0 или нет.
прав. я у себя чтото подумал что булеаны буду побитово складывать. а имел ввиду так:
if ( (result)!=0 && (tempResult)!=0 )
а вот про проверку tempResult == 0 после первого условия — ведь не важно уже проверять
если tempResult == 0 после того как result == 0, то как бы ни перемножали то будет ноль.
а по смыслу кода:
— если оба ненулевые — произведение двух
— если один нулевой, а другой ненулевой — сделать result равным ненулевому
— во всех остальных случаях можно ничего не делать вообще
да всё, проверил уже. твои оба варианта работают, мои провальные — вот даже тесты написал, и через тернарный оператор меньше трёх строчек не вышло:
import java.util.Random;
public class testclass {
public static int task(int result, int tempResult){
result = result == 0 ?
//1.если result == 0 -> result = tempResult.
tempResult : (tempResult == 0 ?
//2.если result !=0 то если tempResult == 0 -> result = result.
result : (result == tempResult ?
//3.если result !=0 и tempResult !=0 то если result == tempResult -> result = result
result : result * tempResult));
//4. иначе result*=tempResult
return result;
}
public static int solution(int result, int tempResult){
result = result == 0 ?
tempResult : result != tempResult && tempResult!= 0 ?
result*=tempResult : result;
return result;
}
public static void main(String[] args){
for (int i=0 ;i<10_000_000;i++){
int rand1 = new Random(System.currentTimeMillis()).nextInt(100) - 100;
int rand2 = new Random(System.currentTimeMillis()).nextInt(100) - 100;
if( task(rand1,rand2) != solution(rand1,rand2) )
throw new RuntimeException("test_failed");
}
}
}
А по-моему в твоём варианте можно сделать красивее моего. А главное понятнее. Первое условие у тебя очень верно выделено. А вот второе должно быть комбинацией двух последних проверок. Рекомендую нарисовать ромбики с выходами влево и вправо — да и нет.
ромбики, да, в итоге их и рисовал вчера) а по поводу того что получилось в итоге без тернарных операторов ничем принципиально от твоих вариантов и не отличается,
if ( result == 0)
result = tempResult;
else if(result!= tempResult && tempResult!=0)
result*=tempResult;
а имеет плюс относительно тернарных только в отсутствии присваивании result=result в крайнем случае.
опять же, меня эта задачка убедила что их ничуть не сложнее обычных if-else читать)
очень читабельно, кстати, становится, если писать ":" под "?" — чтото типа двоичного дерева
1. У меня вопрос по поводу применения энда
Если мы сделаем ,
то вывод будет 5 6.
Что достаточно логично. побитовое умножение будет действовать так
0101 & 0101 = 0101
0111 & 0110 = 0110
А вот если взять 8 и 6, то получим 0
1000 & 0110 = 0
то есть побитовый энд не даёт верных результатов, которые бы показывали, что result и tempResult равны. Вопрос. Наверное, что-то надо подправить?
2. После проверки первого условия никак не проверяется — tempResult == 0 или нет.
а вот про проверку tempResult == 0 после первого условия — ведь не важно уже проверять
если tempResult == 0 после того как result == 0, то как бы ни перемножали то будет ноль.
а по смыслу кода:
— если оба ненулевые — произведение двух
— если один нулевой, а другой ненулевой — сделать result равным ненулевому
— во всех остальных случаях можно ничего не делать вообще
а имеет плюс относительно тернарных только в отсутствии присваивании result=result в крайнем случае.
опять же, меня эта задачка убедила что их ничуть не сложнее обычных if-else читать)