gpt4 book ai didi

php - 这个按位 AND 运算符的目的是什么?

转载 作者:行者123 更新时间:2023-11-29 05:19:48 26 4
gpt4 key购买 nike

该代码是一个cms的基本php代码,它读取Mysql内容以根据三种不同的方法呈现网页,通过id,名称或特殊类型(索引页面,站点地图页面......)。但我不能理解这一行“$r=dbRow("select * from pages where special&$v limit 1");”按位 AND 应该做什么?

<?php
class Page{
static $instances = array();
static $instancesByName = array();
static $instancesBySpecial = array();
function __construct($v,$byField=0,$fromRow=0,$pvq=0){
# byField: 0=ID; 1=Name; 3=special
if (!$byField && is_numeric($v)){ // by ID
$r=$fromRow?$fromRow:($v?dbRow("select * from pages where id=$v limit 1"):array());
}
else if ($byField == 1){ // by name
$name=strtolower(str_replace('-','_',$v));
$fname='page_by_name_'.md5($name);
$r=dbRow("select * from pages where name like '".addslashes($name)."' limit 1");
}
else if ($byField == 3 && is_numeric($v)){ // by special
$fname='page_by_special_'.$v;
$r=dbRow("select * from pages where special&$v limit 1");
}
else return false;
if(!count($r || !is_array($r)))return false;
if(!isset($r['id']))$r['id']=0;
if(!isset($r['type']))$r['type']=0;
if(!isset($r['special']))$r['special']=0;
if(!isset($r['name']))$r['name']='NO NAME SUPPLIED';
foreach ($r as $k=>$v) $this->{$k}=$v;
$this->urlname=$r['name'];
$this->dbVals=$r;
self::$instances[$this->id] =& $this;
self::$instancesByName[preg_replace('/[^a-z0-9]/','-',strtolower($this->urlname))] =& $this;
self::$instancesBySpecial[$this->special] =& $this;
if(!$this->vars)$this->vars='{}';
$this->vars=json_decode($this->vars);
}
function getInstance($id=0,$fromRow=false,$pvq=false){
if (!is_numeric($id)) return false;
if (!@array_key_exists($id,self::$instances)) self::$instances[$id]=new Page($id,0,$fromRow,$pvq);
return self::$instances[$id];
}
function getInstanceByName($name=''){
$name=strtolower($name);
$nameIndex=preg_replace('#[^a-z0-9/]#','-',$name);
if(@array_key_exists($nameIndex,self::$instancesByName))return self::$instancesByName[$nameIndex];
self::$instancesByName[$nameIndex]=new Page($name,1);
return self::$instancesByName[$nameIndex];
}
function getInstanceBySpecial($sp=0){
if (!is_numeric($sp)) return false;
if (!@array_key_exists($sp,$instancesBySpecial)) $instancesBySpecial[$sp]=new Page($sp,3);
return $instancesBySpecial[$sp];
}
}

最佳答案

看来 pages.special 包含一个 bit field (也就是说,其值中的每个位位置都会标记一些特定于应用程序的属性)。

然后,要查找具有特定属性的记录,可以使用所需的“掩码”执行按位 AND 运算——结果中的位位置仅当值和掩码中都设置了相同的位置。 2 位值的完整真值表如下所示:

+---------+------+------------+|  value  | mask | value&mask |+---------+------+------------+|    0b00 | 0b00 |       0b00 ||    0b01 | 0b00 |       0b00 ||    0b10 | 0b00 |       0b00 ||    0b11 | 0b00 |       0b00 ||    0b00 | 0b01 |       0b00 ||    0b01 | 0b01 |       0b01 ||    0b10 | 0b01 |       0b00 ||    0b11 | 0b01 |       0b01 ||    0b00 | 0b10 |       0b00 ||    0b01 | 0b10 |       0b00 ||    0b10 | 0b10 |       0b10 ||    0b11 | 0b10 |       0b10 ||    0b00 | 0b11 |       0b00 ||    0b01 | 0b11 |       0b01 ||    0b10 | 0b11 |       0b10 ||    0b11 | 0b11 |       0b11 |+---------+------+------------+

For example, suppose the lowest-order bit is a flag that the respective page "is readonly"; and the next bit that the page "requires moderation"—a value of (decimal) 2, or 0b10, would indicate that the page is not readonly but does require moderation. So, to find all pages that either are readonly or require moderation, one could do:

SELECT * FROM pages WHERE (special & 0b11) != 0

因为 MySQL 没有真正的 bool 类型(而是将零视为假,将非零视为真),过滤器表达式可以缩写为:

SELECT * FROM pages WHERE special & 0b11

我们也可以用十进制而不是二进制形式表示掩码:

SELECT * FROM pages WHERE special & 3

并且,如果需要,将 LIMIT 应用于查询(尽管在没有 ORDER BY 子句的情况下,结果是不确定的):

SELECT * FROM pages WHERE special&3 LIMIT 1

鉴于这就是我们所要做的(根据您显示的代码),我们只能说以下内容:

查询从 pages 表中选择不确定记录的所有列,其中 special 的值至少设置了一个与掩码 $v

由于 special$v 的语义(以及它们中的位位置)是特定于应用程序的,所以如果没有更深入的了解就不可能再说什么了了解您的应用程序。

请注意,虽然紧凑,但在位字段上使用掩码进行过滤是不可搜索的——因此这往往是非常糟糕的数据库设计。

关于php - 这个按位 AND 运算符的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27501220/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com