source

php에서 비트마스크를 구현하려면 어떻게 해야 하나요?

factcode 2023. 1. 15. 17:14
반응형

php에서 비트마스크를 구현하려면 어떻게 해야 하나요?

비트마스크가 정확한 용어인지 잘 모르겠어요.설명하겠습니다.

php에서는error_reporting함수는 여러 가지 방법으로 호출할 수 있습니다.

// Report simple running errors
error_reporting(E_ERROR | E_WARNING | E_PARSE);

// Reporting E_NOTICE can be good too (to report uninitialized
// variables or catch variable name misspellings ...)
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

// Report all errors except E_NOTICE
// This is the default value set in php.ini
error_reporting(E_ALL ^ E_NOTICE);

비트마스크라는 용어는 php.net 페이지에서 얻은 것입니다.

어쨌든 요점은, 저는 'SIMPLE Method'라는 이름의ls디렉토리의 내용을 반환합니다.

이 함수에는 3Arg가 필요합니다.($syslog_hidden = false, $return_absolute = false, $ext = false )

그래서 함수를 호출할 때 원하는 결과를 설정합니다.숨겨진 디렉토리를 반환할지 여부, 기본 이름만 반환할지 여부 등.

그래서 내가 함수에 전화를 걸 때 나는 쓰고 있다.

ls(true, false, true)
ls(false, false, true)
ls(true, true, true)
etc...

데이터를 어떻게 반환하고 싶은지 표시만 하면 훨씬 읽기 쉬울 것 같아서요.

예를 들어 다음과 같습니다.

ls( INCLUDE_HIDDEN | HIDE_EXTS );
ls( SHOW_ABSOLUTE_PATHS | HIDE_EXTS );

기타...

어떤 플래그를 호출했는지 테스트하려면 어떻게 구현해야 합니까?

사실은 아주 간단해요.우선 구현 방법을 설명하기 위한 코드입니다.이 코드의 동작이나 동작 방법에 대해 모르는 것이 있으면, 코멘트에 추가 질문을 해 주세요.

const FLAG_1 = 0b0001; // 1
const FLAG_2 = 0b0010; // 2
const FLAG_3 = 0b0100; // 4
const FLAG_4 = 0b1000; // 8
// Can you see the pattern? ;-)

function show_flags ($flags) {
  if ($flags & FLAG_1) {
    echo "You passed flag 1!<br>\n";
  }
  if ($flags & FLAG_2) {
    echo "You passed flag 2!<br>\n";
  }
  if ($flags & FLAG_3) {
    echo "You passed flag 3!<br>\n";
  }
  if ($flags & FLAG_4) {
    echo "You passed flag 4!<br>\n";
  }
}

show_flags(FLAG_1 | FLAG_3);

데모


플래그는 정수이므로 32비트플랫폼에서는 최대 32개의 플래그를 정의합니다.64비트 플랫폼에서는 64입니다.플래그를 문자열로 정의할 수도 있습니다.이 경우 사용 가능한 플래그의 수는 어느 정도 무한합니다(물론 시스템리소스의 범위 내).이진법(간단함을 위해 8비트 정수로 줄임)은 다음과 같습니다.

FLAG_1
Dec:    1
Binary: 00000001

FLAG_2
Dec:    2
Binary: 00000010

FLAG_3
Dec:    4
Binary: 00000100

// And so on...

플래그를 결합하여 함수에 전달하면 플래그를 함께 또는 함께 전달합니다.우리가 합격했을 때 어떤 일이 일어나는지 보자.FLAG_1 | FLAG_3

  00000001
| 00000100
= 00000101

어떤 플래그가 설정되어 있는지 확인하려면 플래그가 있는 비트마스크를 선택합니다.그럼 위의 결과를 가져와서FLAG_3설정되었습니다.

  00000101
& 00000100
= 00000100

...플래그 값은 0이 아닌 정수로 반환됩니다.다만, 만약FLAG_2설정되었습니다.

  00000101
& 00000010
= 00000000

0점이야.즉, 값이 전달되었는지 여부를 확인할 때 AND 연산 결과를 부울로 간단히 평가할 수 있습니다.

define( "INCLUDE_HIDDEN", 0x1 );
define( "HIDE_EXTS", 0x2 );
define( "SHOW_ABSOLUTE_PATHS", 0x4 );
//And so on, 0x8, 0x10, 0x20, 0x40, 0x80, 0x100, 0x200, 0x400, 0x800 etc..

그런 다음 각 플래그를 체크할 수 있습니다.ls기능:

if( $flags & INCLUDE_HIDDEN ) { //<-- note just a single &, bitwise and
    //$flags have INCLUDE_HIDDEN
}

다른 업체들은 좋은 제안을 했지만, 최근에는 비트마스크 대신 관련 어레이를 전달하는 것이 훨씬 더 일반적입니다.읽기 쉽고 참/거짓 값뿐만 아니라 다른 변수도 전달할 수 있습니다.다음과 같은 경우:

myFunction(['includeHidden' => true, 'fileExts' => false, 'string' => 'Xyz']);

function myFunction($options) {
    // Set the default options
    $options += [
        'includeHidden' => false,
        'fileExts' => true,
        'string' => 'Abc',
    ];

    if ($options['includeHidden']) {
        ...
    }
    ...
}

언급URL : https://stackoverflow.com/questions/11880360/how-to-implement-a-bitmask-in-php

반응형