настроить функции проверки в Laravel - PullRequest
0 голосов
/ 18 февраля 2019

Мне любопытно, что ($value & ($value - 1)) != 0 говорит о том, что как работает в приведенной ниже проверке, чтобы узнать число, это степень 2?!

function ($attribute, $value, $fail) {
                    if ($value == 0 || ($value & ($value - 1)) != 0) {
                        $fail($attribute . ' is not power of 2!');
                    }
                }

Если я хотел бы получить числа между числами степени 2 в дополнение кСтепень 2 числа, что мне делать?я могу использовать и изменить эту команду?(например, цифры: 1,2,3,4,6,8,12,16, ...)

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Решил алгоритм.Я создал объект правила для своего алгоритма:

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class DoubleThreshold implements Rule
{
    public function passes($attribute, $value)
    {
        $issue = floor(log($value, 2));
        $power1 = pow(2, $issue);
        $power2 = pow(2, $issue - 1);
        $power3 = $power1 + $power2;

        if ($value == 1 || $value == $power1 || $value == $power2 || $value == $power3)
            return true;
        return false;
    }

    public function message()
    {
        return 'The :attribute is not in consider numbers!';
    }
}

Чтобы использовать указанное выше правило, я сделал что-то вроде этого:

public function rules()
{
    return [
        'threshold' => ['required', 'between:1,1000', new DoubleThreshold]
     ];
}
0 голосов
/ 18 февраля 2019

В соответствии с битовым хедблингом И Битовые операторы PHP

public function rules()
{
    return [
        'threshold' => [
            'required',
            'between:1,1000',
            function ($attribute, $value, $fail) {
                $err_message = "Given Value is not acceptable";
                $next_power_of_2 = $value-1;
                $next_power_of_2 |= $next_power_of_2 >> 1;
                $next_power_of_2 |= $next_power_of_2 >> 2;
                $next_power_of_2 |= $next_power_of_2 >> 4;
                $next_power_of_2 |= $next_power_of_2 >> 8;
                $next_power_of_2 |= $next_power_of_2 >> 16;
                //closest upper power 2 to given number
                $next_power_of_2++;
                //closes lower power 2 number to given value
                $previous_power_of_2 = $next_power_of_2 >> 1;

                if ($value == 0) $fail($err_message);//check number is zero

                else if (($value & ($value - 1)) == 0) {}//check number is power of 2

                else if (($next_power_of_2 + $previous_power_of_2) / 2 != $value) //check number is between two power of 2
                    $fail($err_message);
            },
        ]
    ];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...