假设每块大小为 4096 。
0 大小占用 0 块, 4095 占用 1 块, 4096 占用 1 块, 4097 占用 2 块。
我的办法是
$block = ($size & 4095) ? ($size | 4095) + 1: $size;
有没有更简单的算法?
反过来,(块数-1)的最简单算法又是什么?
0 大小对应 0 块, 4095 对应 0 块, 4096 对应 0 块, 4097 对应 1 块。
假设每块大小为 4096 。
0 大小占用 0 块, 4095 占用 1 块, 4096 占用 1 块, 4097 占用 2 块。
我的办法是
$block = ($size & 4095) ? ($size | 4095) + 1: $size;
有没有更简单的算法?
反过来,(块数-1)的最简单算法又是什么?
0 大小对应 0 块, 4095 对应 0 块, 4096 对应 0 块, 4097 对应 1 块。
我说得不大清楚。准确地说,是文件占用块数的总大小,以及(块数-1)的大小。
也即:
0 大小占用 0 Byte , 4095 占用 4096 Byte , 4096 占用 4096 Byte , 4097 占用 8192 Byte 。
0 大小对应 0 Byte , 4095 对应 0 Byte , 4096 对应 0 Byte , 4097 对应 4096 Byte 。
@geeglo @Elethom @akira ceil()或(size + 4095) / 4096处理(块数-1)的时候, 0 大小对应 -4096 Byte ,需要 ugly 的处理……。
@defia 取整之后或位移 12 位之后+1 ,那么 0 大小占用 4096byte 。
@mko0okmko0 我当时分成 4k 的。
|
geegloFeb 27, 2016
1
看样子是 PHP
函数 ceil 不够用? |
|
ElethomFeb 27, 2016 via iPhone
2
(size + 4095) / 4096
這樣嗎? |
|
defiaFeb 27, 2016
3
难道不是除法取整加一就行了么..
|
|
defiaFeb 27, 2016
4
当然也可以位移 12 位之后+1
|
|
akiraFeb 27, 2016
5
ceil(x / 4096)
@@ |
|
mko0okmko0Feb 27, 2016
6
目标是磁碟真实块数量吗?
你需要先知道档案系统是用多少容量当一个块的. 当然用常用的 4K 也是可以.但这只是常用.不是定数或是真实用量. 例如存放大型档案的系统.有用 64K 当一块的. |
|
7
我说得不大清楚。准确地说,是文件占用块数的总大小,以及(块数-1)的大小。
也即: 0 大小占用 0 Byte , 4095 占用 4096 Byte , 4096 占用 4096 Byte , 4097 占用 8192 Byte 。 0 大小对应 0 Byte , 4095 对应 0 Byte , 4096 对应 0 Byte , 4097 对应 4096 Byte 。 @geeglo @Elethom @akira ceil()或(size + 4095) / 4096 处理(块数-1)的时候, 0 大小对应 -4096 Byte ,需要 ugly 的处理……。 @defia 取整之后或位移 12 位之后+1 ,那么 0 大小占用 4096byte 。 @mko0okmko0 我当时分成 4k 的。 |
|
geegloFeb 27, 2016
8
@schezukNewTos
很基础的,你应该弄错了 <?php $per = 4096; $b1 = 4095; $b2 = 4097; $b3 = 0; $x = ceil($b1/$per)*$per; $x2 = ceil($b2/$per)*$per; $x3 = ceil($b3/$per)*$per; echo $x; echo '<br/>'; echo $x2; echo '<br/>'; echo $x3; 结果: 4096 8192 0 |
|
9
@geeglo 我是说(块数-1)对应的字节数。
|
|
geegloFeb 27, 2016
10
@schezukNewTos
没办法省判断。用三目运算检查一下输入的块数应该是最短的了。 |
|
11
@geeglo 好吧。谢谢~~~
|