如何在不使用任何算术运算的情况下求 x mod 15?

2024-02-27

假设我们得到一个无符号整数。并且不使用任何算术运算符,即+ - / * or %,我们要找到x mod 15。我们可以使用二进制位操作。

据我所知,我是根据两点得出这个结论的。

a = a mod 15 = a mod 16 for a<15

Let a = x mod 15 then a = x - 15k(对于一些非负数k).

ie a = x - 16k + k...

ie a mod 16 = ( x mod 16 + k mod 16 ) mod 16

ie a mod 15 = ( x mod 16 + k mod 16 ) mod 16

ie a = ( x mod 16 + k mod 16 ) mod 16

好的。现在来实施这个。 Amod16操作基本上是& OxF. and k基本上是x>>4

So a = ( x & OxF + (x>>4) & OxF ) & OxF.

归根结底就是将 2 个 4 位数字相加。这可以通过位表达式来完成。

sum[0] = a[0] ^ b[0]

sum[1] = a[1] ^ b[1] ^ (a[0] & b[0])

... 等等

这对我来说似乎是在欺骗。我希望有一个更优雅的解决方案


这让我想起了 10 进制的一个老把戏,叫做“抛弃 9”。这用于检查手工执行的大额计算的结果。 在这种情况下123 mod 9 = 1 + 2 + 3 mod 9 = 6.

发生这种情况是因为 9 比数字基数 (10) 少 1。 (省略证明;))

因此考虑以 16 为基数(十六进制)的数字。你应该能够做到:

0xABCE123 mod 0xF = (0xA + 0xB + 0xC + 0xD + 0xE + 0x1 + 0x2 + 0x3 ) mod 0xF 
                  = 0x42 mod 0xF 
                  = 0x6 

现在您仍然需要施展一些魔法才能使添加的内容消失。但它给出了正确的答案。

UPDATE:

这是 C++ 的完整实现。这f查找表将数字对求和 mod 15。(与字节 mod 15 相同)。然后,我们重新打包这些结果,并在每轮中重新应用一半的数据。

#include <iostream>

uint8_t f[256]={
  0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,0,
  1,2,3,4,5,6,7,8,9,10,11,12,13,14,0,1,
  2,3,4,5,6,7,8,9,10,11,12,13,14,0,1,2,
  3,4,5,6,7,8,9,10,11,12,13,14,0,1,2,3,
  4,5,6,7,8,9,10,11,12,13,14,0,1,2,3,4,
  5,6,7,8,9,10,11,12,13,14,0,1,2,3,4,5,
  6,7,8,9,10,11,12,13,14,0,1,2,3,4,5,6,
  7,8,9,10,11,12,13,14,0,1,2,3,4,5,6,7,
  8,9,10,11,12,13,14,0,1,2,3,4,5,6,7,8,
  9,10,11,12,13,14,0,1,2,3,4,5,6,7,8,9,
  10,11,12,13,14,0,1,2,3,4,5,6,7,8,9,10,
  11,12,13,14,0,1,2,3,4,5,6,7,8,9,10,11,
  12,13,14,0,1,2,3,4,5,6,7,8,9,10,11,12,
  13,14,0,1,2,3,4,5,6,7,8,9,10,11,12,13,
  14,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,
  0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,0};

uint64_t mod15( uint64_t in_v )
{
  uint8_t * in = (uint8_t*)&in_v;
  // 12 34 56 78 12 34 56 78 => aa bb cc dd
  in[0] = f[in[0]] | (f[in[1]]<<4);
  in[1] = f[in[2]] | (f[in[3]]<<4);
  in[2] = f[in[4]] | (f[in[5]]<<4);
  in[3] = f[in[6]] | (f[in[7]]<<4);

  // aa bb cc dd => AA BB
  in[0] = f[in[0]] | (f[in[1]]<<4);
  in[1] = f[in[2]] | (f[in[3]]<<4);

  // AA BB => DD
  in[0] = f[in[0]] | (f[in[1]]<<4);

  // DD => D
  return f[in[0]];
}


int main()
{
  uint64_t x = 12313231;
  std::cout<< mod15(x)<<" "<< (x%15)<<std::endl;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不使用任何算术运算的情况下求 x mod 15? 的相关文章

  • 计算 Int32 中的前导零

    如何计算一个数组中的前导零Int32 所以我想做的是写一个函数 如果我的输入是 2 它返回 30 因为在二进制中我有000 0000000000010 NOTE使用 dotnet core gt 3 0 看here https stacko
  • ValueError:数学域错误,不断弹出

    我时常收到此消息 我尝试了所有的变化 改变我使用 sqrt 的方式 一步一步地做 等等 但这个错误仍然不断出现 这可能是一个菜鸟错误 我没有注意到 因为我是 python 和 ubuntu 的新手 这是我的源代码 一个非常简单的程序 To
  • Java 中的微分方程

    我正在尝试用java创建一个简单的SIR流行病模型模拟程序 基本上 SIR 由三个微分方程组定义 S t l t S t I t l t S t g t I t R t g t I t S 易感人群 I 感染人群 R 康复人群 l t c
  • 使用浏览器内的 JS 数值求解三角方程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 给定变量值s v and h 并给定一个库 例如数字 js http www numericjs com index php我怎样才能用数
  • NSArray 中不重复的所有可能组合

    假设我有一个包含 3 个数字的数组 NSArray array 1 2 3 我想进行所有组合而不重复 所以我需要的是这样的 1 2 3 1 2 2 3 1 3 1 2 3 我当前的代码是这样的 NSArray array 1 2 3 int
  • 在 3d 空间中的两个平面之间进行插值

    我正在开发一种工具 可以让您在 3D 体积 上圈出 包围事物 我想通过标记 切片 1 和 3 并从该信息 填充 切片 2 来节省时间 两个简单的解决方案是 1 slice2 slice1 AND slice3 gets the overla
  • 如何对“2-1”这样的字符串进行数学计算以产生“1”?

    我只是想知道 PHP 是否有一个函数可以接受像这样的字符串2 1并产生它的算术结果 或者我必须手动执行此操作explode 获取算术运算符左侧和右侧的值 我知道这个问题很老了 但我昨晚在寻找不太相关的东西时遇到了它 而且这里的每个答案都很糟
  • 限制纬度和经度值的模数

    我有代表纬度和经度的双精度数 我可以轻松地将经度限制为 180 0 180 0 具有以下功能 double limitLon double lon return fmod lon 180 0 360 0 180 0 这是有效的 因为一端是排
  • 将这个 if-then 逻辑转换为布尔表达式?

    我在使这段代码更简洁 最好是单个布尔表达式 方面有点绞尽脑汁 这是我的代码 if d Unemployed if type Unemployed tmp Unemployed true else tmp Unemployed false
  • 有没有办法根据值是大于 0.5 还是小于 0.5 来进行下限/上限?

    我正在尝试舍入我的价值观 以便如果它是0 5或更大 则变为1 否则就变成0 例如 3 7 gt 4 1 3 gt 1 2 5 gt 3 有任何想法吗 Math Round 3 7 MidpointRounding AwayFromZero
  • 将数字公平分配到两组的算法

    给定一组 n 个数字 1 每组的总数最多相差 1 A 中所有数字的总和尽可能接近 B 中所有数字的总和 即分布应该是公平的 有人可以建议一种有效的算法来解决上述问题吗 谢谢 由于数字很小 因此它不是 NP 完全的 为了解决这个问题 你可以使
  • 计算 Adamic-Adar 的快速算法

    我正在研究图形分析 我想计算一个 N N 相似度矩阵 其中包含每两个顶点之间的 Adamic Adar 相似度 为了概述 Adamic Adar 让我从以下介绍开始 给定邻接矩阵A无向图的G CN是两个顶点的所有公共邻居的集合x y 两个顶
  • JavaScript 或 IEEE-754 中的舍入怪癖?

    我在一个单元测试中遇到了一个奇怪的问题 我在 JavaScript 中得到了意外的舍入结果 2 005 toFixed 2 produces 2 00 2 00501 toFixed 2 produces 2 01 最初我怀疑这只是 Web
  • Java 将两个 int 存储在 long 中

    我想将两个整数存储在一个 long 中 而不是必须创建一个新的Point每次都反对 目前 我尝试过这个 它不起作用 但我不知道它出了什么问题 x and y are ints long l x l l lt lt 32 y 我得到的 int
  • 如何手动(按位)执行(浮动)x?

    现在 这是我应该实现的函数的函数头 float from int Return bit level equivalent of expression float x Result is returned as unsigned int bu
  • 计算三次贝塞尔曲线的弧长、曲线长度。为什么不工作?

    我正在用这个算法计算弧长 三次贝塞尔曲线的长度 function getArcLength path var STEPS 1000 gt precision var t 1 STEPS var aX 0 var aY 0 var bX 0
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • 检查一个数是否是完全平方数

    如何检查一个数是否是完全平方数 速度并不重要 目前 只是工作 See also Integer square root in python https stackoverflow com questions 15390807 依赖任何浮点计
  • 位操作,排列位

    我正在尝试创建一个循环 循环遍历所有不同的整数 其中最后 40 位中的 10 位设置为高 其余设置为低 原因是我有一个包含 40 个不同值的地图 并且我想对其中 10 个值相乘的所有不同方式求和 这只是出于好奇 所以真正感兴趣的是 bitm
  • 使用 FIND 命令进行并集、交集和排除?

    我需要使用 find 命令管理列表 假设列表在非不同列表中具有随机名称 即它们的交集不是空集 我能怎么做 A B 查找列表A中除列表B中的文件之外的文件 A 路口 B 查找列表 A 和 B 共有的文件 请咨询here https stack

随机推荐

  • 删除数组中的空值元素

    Array 0 gt 0 value is int 0 which isn t empty value 1 gt this is empty value 2 gt this is empty value 我想让上面的数组如下 有人可以帮助我
  • 使用自定义 url/ 页面覆盖 Django-allauth 登录/注册 url

    我已经将 django allauth 配置为通过 Facebook Twitter 和 Google 登录 但是 django allauth 仅接受登录请求 accounts login 仅在以下位置提出注册请求 accounts si
  • 如何在 Haskell 中的子类定义中定义默认实现?

    我是 Haskell 的新人 以下是我的问题 给定这个类 class MyClass a where foo a gt a 然后我有一个更具体的子类 class MyClass a gt SubClass a where foo param
  • 何时使用 MongoDB [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我正在编写一个不一定需要的应用程序扩展能力因为它一开始不会收集大量数据 但是 如果我幸运的话 我可能会走上这条路 我将在同一个机器上运行我的网络
  • 如何将C++变量数据放入system()函数中

    如何将 C 变量数据放入 system 函数中 看下面的代码 include
  • 将地图/字典的 Spark Dataframe 列扁平化为多列

    我们有一个DataFrame看起来像这样 DataFrame event string properties map
  • 在vim中显示尾随空格

    我在 vimrc 中设置了以下选项 set listchars tab trail set list 并期望在代码中使用空格进行制表的那些地方看到点 我使用空格 而不是制表符 然而 结果却不同 您能否建议如何达到预期的结果 谢谢 你应该检查
  • 从列表中选择随机值,直到它们在Python中消失

    使用 Python 我想从列表中随机选择人员 并将他们分成 5 人一组 而不是多次选择同一个人 人们由两个标准定义 年龄和性别 人员名单如下所示 PPL 1 4 6 2 5 5 3 7 3 4 2 8 5 4 6 其中每个列表中的 3 个数
  • Google Shopping REST API 按类别限制

    我正在尝试按类别限制 Google 购物请求 在这种情况下 我只希望返回实际的电影 DVD 蓝光 这是我要传递的内容 其中 MY KEY 是我从以下位置获得的密钥 https code google com apis console pro
  • 如何更改用于指示已在 TabHost 上选择选项卡的颜色?

    在安卓上TabHost layout 当用户选择一个选项卡时 选项卡的颜色会暂时改变 如何禁用此颜色更改 或指定选项卡更改为的颜色 UPDATED 我没有制作自己的示例并因此而获得荣誉 而是找到了我的旧书签教程 如何更改 Android 选
  • liquibase.properties 中的 Liquibase 变更日志参数

    根据文档 参数值按以下顺序查找 作为参数传递给 Liquibase 运行程序 有关如何传递它们的信息 请参阅 Ant command line 等文档 作为 JVM 系统属性 在 DatabaseChangeLog 文件本身的参数块 Tag
  • 上传时转换视频[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我想在用户上传视频时将其转换 例如从 wmv 格式转换为 flv 我可以转换视频或单独上传 但如何立即执行这些操作 我使用 ffmpeg 进行转换 例
  • 如何创建一个简单的谷歌地图地址搜索并在flutter中自动完成并获取纬度和经度?

    我是 Flutter 的新手 我正在尝试构建一个简单的谷歌地图应用程序 我已经在应用程序中实现了谷歌地图 并且运行完美 但现在我想添加谷歌地图自动完成功能 但我找不到专注于它的简单教程或示例 我有一个文本字段 我想根据用户输入的内容显示其下
  • Facebook 以页面管理员身份发布页面提要

    var message test var picture http l yimg com f i tw ks show 120604 mntl01 jpg var link https www youtube com watch v BIl
  • ReactJS:当输入元素进入 DOM 时如何将焦点设置到输入元素?

    如何将焦点设置到input元素进入 DOM 时 Scenario 单击按钮时 将显示输入元素 如何将焦点设置到该元素 代码片段 class Component extends React Component constructor prop
  • 错误处理仅有效一次

    我有一个非常简单的 VBA 代码 应该尝试打开一个不存在的文件 将我发送到错误处理程序 然后以无限循环返回到我的代码 故意 但是 编译器仅在第一次捕获错误 然后在第二次传递时中断 我已经尝试了 On Error 语句的每种组合以在第二次传递
  • 如何增加 QListWidget 中项目/行的填充(或边距)?

    我们正在寻找一种方法来增加填充 或边距 QListWidget我们正在我们的应用程序中使用 我们希望为所有四个方向增加此值 以便为列表中的文本提供一些额外的空间 我查看了两者的文档QListWidget http doc qt io qt
  • 关闭按钮仅适用于 Qt 中的某些选项卡

    我正在使用 Qt 完成大学作业 并且我想使用QTabWidget显示一个聊天窗口 就像Pidgin s https www pidgin im 我想让 群聊 选项卡始终打开且无法关闭 而其余 私人频道 选项卡可关闭 QTabWidget s
  • 所有页面/视图都需要 Blazor /Pages 文件夹吗?

    使用默认的 Blazor helloworl 应用程序 我将 FetchData razor 页面复制到单独的自定义文件夹中 结果 页面未正确呈现 页面正在占用 整个屏幕 导航菜单消失了 问题 blazor 页面 视图必须位于 Pages
  • 如何在不使用任何算术运算的情况下求 x mod 15?

    假设我们得到一个无符号整数 并且不使用任何算术运算符 即 or 我们要找到x mod 15 我们可以使用二进制位操作 据我所知 我是根据两点得出这个结论的 a a mod 15 a mod 16 for a lt 15 Let a x mo