- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在开发一个程序来处理使用散列的文件。数据被分成长度为 0x1000 的 block 。我需要计算具有特定起始和结束偏移覆盖的段的 block 数量。
例如,如果段的起始偏移量为 0x2000,结束位置为 0x3523,则表示它占用了两个 block ,0x2000 和 0x3000。它不占用数据 block 中的完整 0x2000 字节,但当它在其中时被认为是“占用一个 block ”。我的第一个想法是:
( ( EndingOffset - StartingOffset ) + 0xFFF ) >> 0xC
这相当于 Math.Ceil((EndingOffset - StartingOffset)/0x1000)
,但我是按位运算符的新手,喜欢使用它们的挑战。
无论如何,逻辑是有缺陷的,因为,这就是我遇到的情况,如果起始偏移量是 0x3D8A,结束偏移量是 0x671D,则两者之间的差值是 0x2993。四舍五入为 0x3000,或三个 block 。该段实际上占用了四个,0x3000、0x4000、0x5000和0x6000。所以我的下一列火车,不幸的是我的最后一列火车,是找到该段所在的第一个 block 的偏移量与该段不在的第一个 block 的偏移量之间的差异。
对于 0x3D8A 和 0x671D,这将我带到 (0x7000 - 0x3000) >> 0xC
,它成功地产生了正确数量的 block ,4。我写它的方式是我想要改进的,即:
BlockSize = ((((OffsetEnd + 0xFFF) >> 12) + 1) - ((OffsetStart + 0xFFF) >> 12));
我知道我已经把一个简单的问题复杂化了,但是我的小脑袋想不出如何把它写得更好。
编辑:这很尴尬。我不知道我是怎么想到的而不是
(((OffsetEnd + 0xFFF) >> 12) - (OffsetStart >> 12));
虽然看起来还不完整。
edit 2:抱歉,忘了说结束偏移量是独占的,不包含在内,是段最后一个字节之后的位置,意思是:
(((OffsetEnd - 1 + 0xFFF) >> 12) - (OffsetStart >> 12));
编辑 3:根据 Kerek 的回答,我最终得到:
BlockSize = 1 + (offsetEnd - 1 >> 12) - (offsetStart >> 12);
..或者,从 0 开始计数,
BlockSize = (offsetEnd - 1 >> 12) - (offsetStart >> 12);
编辑 4:忘记从零开始计数,我坚持:
BlockSize = 1 + (offsetEnd - 1 >> 12) - (offsetStart >> 12);
最佳答案
假设您的数据范围为 [start, end) , 这很简单:
unsigned int start_block = start_offset / 0x1000;
unsigned int end_block = end_offset / 0x1000;
unsigned int number_of_blocks = end_block - start_block + (end_offset > start_offset && end_offset % 0x1000 > 0 ? 1 : 0);
我想 /0x1000
的 bitfiddling 等价物是 >> 12
。
您的数据将占据 block 范围 [start_block, end_block)。请注意, block 0 是 [0x0000, 0x1000), block 1 是 [0x1000, 0x2000)`,等等
正如@Ron 指出的那样,您需要一个条件来区分最后一个(“one-past”) block 是否为空,并在后一种情况下将 block 计数递增 1。
关于c# - 这个按位表达式有更好的逻辑吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8721963/
当我尝试加载库 Raster 时,我收到如下错误: 错误:inDL(x, as.logic(local), as.logic(now), ...) 中的“raster”的包或命名空间加载失败:无法加载
当我尝试加载库 Raster 时,我收到如下错误: 错误:inDL(x, as.logic(local), as.logic(now), ...) 中的“raster”的包或命名空间加载失败:无法加载
望着help section about_Comparison_Operators of PowerShell我是这样理解的: PS C:\> $false,$false -eq $true PS C
我刚刚修改了旧代码,现在似乎没有任何效果。请您指导我哪里出错了。 一些不起作用的事情是: 以前,焦点始终停留在屏幕上唯一的输入字段上。 (现在不行了),代码中的 if else 条件也不起作用。 On
请帮我找到一个使用普通 'ol javascript 的解决方案(我无法使用外部框架)。此外,CSS :hover 选择器不适用于现实世界的实现。 注册事件发生的事情设置所有调用最后注册事件数组项。
我想创建一个软件来为残障 child 交通规划公交路线(及其最佳载客量)。 这些总线具有以下规范: m 个座位(最多 7 个 - 因为有司机和助理) o 轮椅“座位”(最多 4 个) 固定的最大负载量
有人能帮我吗?似乎我的 for 逻辑根本不起作用,因为它一直在上午 12:00 返回我的开始时间 这是我的代码 Sub forlogic() Dim i As Single Dim t
我正在尝试设置 OR两个切片器过滤器之间的逻辑。两个切片器来自相同的数据集。以下是更多详细信息: 我的源表: 带切片器的视觉效果: 我的目标是,如果我从切片器 1 和切片器 2 中选择任何值,我的视觉
我有以下 C 语句: int res = x & (x ^ y); 有没有办法做同样的事情,但每次只使用一次x和y? 例如: x | (~x & y) == x | y 最佳答案 是的,通过扩展 xo
我正在创建 Azure 逻辑应用程序以将新的 Sharepoint 文件添加到 Azure Blob。 Sharepoint 由我的公司运行,我使用我的凭据登录来为逻辑应用程序创建 Sharepoin
我有一个问题要求为给定函数合成最简单的乘积表达式总和。基本上,如果 AB == CD,则函数为 1,否则为 0,结果如下: (!A && !B && !C && !D) || (!A && B &&
我正在尝试确定是否可以在不溢出的情况下计算两个 32 位整数的总和,同时仅使用某些按位运算符和其他运算符。因此,如果整数 x 和 y 可以相加而不会溢出,则以下代码应返回 1,否则返回 0。 ((((
处理乍一看需要许多嵌套 if 语句的复杂业务逻辑的好方法是什么? 例子: 折扣券。可能: 1a) 超值折扣 1b) 百分比折扣 2a) 正常折扣 2b) 累进折扣 3a) 需要访问优惠券 3b) 不需
假设我有一个“numbers”对象数组,其中包含“startNo”整数和“endNo”整数。 数组中可以有多个“数字”,我想获取一个包含修改对象的新数组,该数组仅具有不重叠的范围。 例如:如果数组有:
我在这个问题上遇到了困难。我正在使用 JavaScript。 我有一个文本区域,用于检测 @ 输入并将其位置存储在数组中。 var input = "@a @b @c" //textarea var
默认 IN 使用 OR 基本逻辑。有没有办法在范围内使用 AND 基本逻辑。 例如下面的查询 SELECT ItemId,CategoryID FROM ItemCategories WHERE Ca
我想在您将鼠标悬停在网站图像上时添加叠加层。我在这里实现了这个,它工作正常http://jsfiddle.net/stujLbjh/ 这是js代码: var divs = document.query
这个问题在这里已经有了答案: Which is faster: x>2 是否比 x>>31 快?换句话说,sar x, 2 是否比 sar x, 31 快?我做了一些简单的测试,他们似乎有相同的速度
我有grails criteriaQuery,我在这里再次检查OR逻辑,就像这样一个状态变量: or { eq("status", Status.ONE) eq("status",
我有grails criteriaQuery,我在这里再次检查OR逻辑,就像这样一个状态变量: or { eq("status", Status.ONE) eq("status",
我是一名优秀的程序员,十分优秀!