>  기사  >  백엔드 개발  >  PHP의 비트 연산 사용에 대한 자세한 논의

PHP의 비트 연산 사용에 대한 자세한 논의

黄舟
黄舟원래의
2017-03-13 16:41:37920검색

아래 편집기는 PHP비트 연산 사용에 대한 진부한 표현을 제공합니다. 편집자님이 꽤 좋다고 생각하셔서 지금 공유하고 모두에게 참고용으로 드리고자 합니다. 에디터를 따라가서 살펴보겠습니다.

실제 응용에서는 사용자 권한을 적용할 수 있습니다

여기서 언급한 권한 관리 방법은 일반적으로 사용되는 방법입니다. 주로 "비트 연산자" 연산인 & 비트와 연산자 , | 연산에 십진수가 포함되면 이진수로 변환하여 연산에 참여하게 되며, 계산 결과를 십진수로 변환하여 출력하게 됩니다.

권한 값은

2^0=1, 해당 2자리 숫자는 "0001"입니다(여기서는^I) "제곱"으로 표현, 즉 2의 0승, 아래와 동일)

2^1=2, 해당 2진 숫자는 "0010"
2^2=4, 해당 2진수 숫자는 "0100"
2^3=8이고 해당 이진수는 "1000"입니다

숫자가 특정 숫자 범위 내에 있는지 확인하려면 다음을 수행하세요. & 연산자를 사용하세요(값은 Winning 위의 표에 있음)

예: 7=4|2|1 (단순히 7=4+2+로 이해해도 됩니다. 1)

&를 사용하여 연산하면 7&4, 7&2, 7&1이 모두 참이고, 7&8이 거짓이면

&, | 잘 알고 계시다면 매뉴얼을 확인하여 사용법을 확인하세요.

예를 살펴보겠습니다.


아아아아

좋아요, 허가 점수도 그 중 하나입니다. 알고리즘은 이렇습니다. 간단하고 효율적이라고 할 수 있습니다. 이해하셨는지 모르시는지는 모르겠습니다. 예문만 기억하시면 됩니다. 전제는 권한 값을 잘 분배하는 것, 즉 1, 2, 4, 8, 16...(여기에도 순서 문제가 있습니다. 권한이 높을수록 권한 값도 높아지는 등의 문제가 있습니다.) 위의 예에서 설명한 삭제 권한). 권한 분배 테이블을 사용하면 개인에게 어떤 권한을 부여할지 결정할 수 있으며, 해당 권한 값을 추가하기만 하면 원하는 권한을 쉽게 이해할 수 있습니다.

이 방법은 사용하기가 매우 쉽습니다. 권한을 세밀하게 분배하면 권한 값이 점점 커진다는 점입니다. 권한을 모두 부여하면 2의 거듭제곱이 얼마나 되는지 스스로 생각해 보십시오. 모두 추가하세요. 그러나 일반 권한의 경우 이것으로 충분합니다.

다음은 간단한 적용 예시입니다

(1) int 유형 결정변수 a 홀수인가요, 짝수인가요?

a&1 = 0 짝수

a&1 = 1 홀수

(2) int 유형 변수 a를 취합니다. k번째 비트(k=0,1,2...sizeof(int)), 즉 a>>k&1

(3)은 int 유형입니다. 변수 a의 k 번째 비트는 0으로 지워집니다. 즉, a=a&~(17494b1298a755141cb68ecfe9741bbc3

(5) int type 변수는 왼쪽으로 k번 순환적으로 이동합니다. 즉, a=a44c4a9365475fe846a654cf8bbadc4ee>k|a<< ;16-k (sizeof(int)=16으로 가정)

(7) 정수의 평균

의 경우 두 정수 x, y, (x+y)/2를 사용하여 평균을 계산하면 x+y가 INT_MAX보다 클 수 있으므로 오버플로가 발생하지만 평균 값은 확실히 오버플로되지 않는다는 것을 알고 있습니다. 다음 알고리즘을 사용합니다. :


// 赋予权限值-->删除:8、上传:4、写入:2、只读:1
define(“mDELETE”,8);
define(“mUPLOAD”,4);
define(“mWRITE”,2);
define(“mREAD”,1);
//vvvvvvvvvvvvv使用说明vvvvvvvvvvvvv
//部门经理的权限为(假设它拥有此部门的所有权限),| 是位或运行符,不熟悉的就查查资料
echo mDELETE|mUPLOAD|mWRITE|mREAD ,”
“;// 相当于是把上面的权限值加起来:8+4+2+1=15
// 设我只有 upload 和 read 权限,则
echo mUPLOAD|mREAD ,”
“;//相当于是把上传、只读的权限值分别相加:4+1=5
/*
*赋予它多个权限就分别取得权限值相加,又比如某位员工拥有除了删除外的权限其余都拥有,那它的权限值是多少?
*应该是:4+2+1=7
*明白了怎么赋值给权限吧?
*/
//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//判断某人的权限可用,设权限值在$key中
/*
*判断权限用&位与符,
*/
$key = 13;//13=8+4+1
if($key & mDELETE) echo “有删除权限
“; //8
if($key & mUPLOAD) echo “有上传权限
“; //4
$a=$key & mWRITE; echo “有写权限
“.$a; //无此权限
if($key & mREAD) echo “有读权限
“; //1
?>

(8) 정수 판단 2의 거듭제곱인가? (9) 임시값 없이 두 정수를 교환한다


int average(int x, int y) //返回X,Y 的平均值

{ 

return (x&y)+((x^y)>>1);

}

(10) 절대값 계산


boolean power2(int x)

{

return ((x&(x-1))==0)&&(x!=0);

}

(11) 모듈로 연산이 비트 연산으로 변환됩니다(오버플로 없이)

void swap(int x , int y)

{

x ^= y;

y ^= x;

x ^= y;

}


(12) 곱셈 연산이 변환됩니다. 비트 연산으로 (오버플로 없이)

int abs( int x )

{

int y ;

y = x >> 31 ;

return (x^y)-y ; //or: (x+y)^y

}

( 13) 나누기 연산을 비트 연산으로 변환합니다(오버플로 없이)

a % (2^n) 等价于 a & (2^n – 1)

(14) a % 2는 a & 1

(15) if (x == a) x= b;

a * (2^n) 等价于 a<< n

(16) x의 반대 수는 (~x+1)

로 표현됩니다. 32비트 시스템에서 32비트 이상 오른쪽으로 이동하지 말고, 결과가 32비트를 초과할 수 있는 경우 오른쪽으로 이동하지 마세요. 아래로 이동하고 왼쪽으로 이동

위 내용은 PHP의 비트 연산 사용에 대한 자세한 논의의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.