仅使用按位函数求出表示 2 的补码需要多少位

2024-01-15

我们可以假设 int 是 2 的补码的 32 位 唯一合法的运营商是: ! 〜& ^ | + >

此时我正在使用暴力

int a=0x01;
x=(x+1)>>1; //(have tried with just x instead of x+1 as well)
a = a+(!(!x));

... 最后 2 个陈述重复了 32 次。每次 x 移动一位时,a 就会加 1,并且对于所有 32 位,!= 0

使用测试编译器,它说我的方法在测试用例 0x7FFFFFFF(0 后跟 31 个 1)上失败,并说这个数字需要 32 位来表示。我不明白为什么这不是 31 (我的方法计算的)任何人都可以解释为什么吗?我需要改变什么来解决这个问题?


0x7FFFFFFF确实需要 32 位。它可以表示为unsigned仅 31 位的整数:

111 1111 1111 1111 1111 1111 1111 1111

但如果我们使用二进制补码将其解释为有符号整数,那么前导1则表明它是负数。所以我们必须前置一个前导0:

0 111 1111 1111 1111 1111 1111 1111 1111

然后将其变为 32 位。

As for what you need to change — your current program actually has undefined behavior. If 0x7FFFFFFF (231-1) is the maximum allowed integer value, then 0x7FFFFFFF + 1 cannot be computed. It is likely to result in -232, but there's absolutely no guarantee: the standard allow compilers to do absolutely anything in this case, and real-world compilers do in fact perform optimizations that can happen to give shocking results when you violate this requirement. Similarly, there's no specific guarantee what ... >> 1 will mean if ... is negative, though in this case compilers are required, at least, to choose a specific behavior and document it. (Most compilers choose to produce another negative number by copying the leftmost 1 bit, but there's no guarantee of that.)

所以真正唯一确定的解决方法是:

  • 使用不存在这些问题的算法重写整个代码;或者
  • 专门检查以下情况x is 0x7FFFFFFF(返回一个硬编码的32)以及这种情况x是负数(将其替换为~x, i.e. -(x+1),并照常进行)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

仅使用按位函数求出表示 2 的补码需要多少位 的相关文章

  • Asp.net core默认路由

    简化版Startup code public void ConfigureServices IServiceCollection services services AddMvc public void Configure IApplica
  • 从实体获取单列

    如何从查询中获取单个列而不是整个对象 我可以这样做来获取整个对象 但我想要的只是名称 IList
  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • 当其源是 https uri 时如何使 wpf MediaElement 播放

    在 wpf 独立应用程序 exe 中 我在主窗口中包含了 MediaElement
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • 为什么在 C++ 中声明枚举时使用 typedef?

    我已经很多年没有写过任何 C 了 现在我正试图重新开始 然后我遇到了这个并考虑放弃 typedef enum TokenType blah1 0x00000000 blah2 0X01000000 blah3 0X02000000 Toke
  • 如何查明 .exe 是否正在 C++ 中运行?

    给定进程名称 例如 程序 exe C 标准库没有这样的支持 您需要一个操作系统 API 来执行此操作 如果这是 Windows 那么您将使用 CreateToolhelp32Snapshot 然后使用 Process32First 和 Pr
  • 类中是否可以有虚拟类声明?

    我正在为个人项目中框架的各个组件设置一个接口 我突然想到了一些我认为可能对接口有用的东西 我的问题是这是否可能 class a public virtual class test 0 class b public a public clas
  • “没有合适的默认构造函数可用”——为什么会调用默认构造函数?

    我已经查看了与此相关的其他一些问题 但我不明白为什么在我的情况下甚至应该调用默认构造函数 我可以只提供一个默认构造函数 但我想了解它为什么这样做以及它会产生什么影响 error C2512 CubeGeometry no appropria
  • 如何设置消息队列的所有者?

    System Messaging MessageQueue 类不提供设置队列所有权的方法 如何以编程方式设置 MSMQ 消息队列的所有者 简短的答案是 p invoke 对 windows api 函数的调用MQSetQueueSecuri
  • 如何在新窗口中打开图像或pdf文件?

    我有一个 gridview 它包含文件名和文件路径 图像和 pdf 格式文件 其中我使用了模板字段 在该字段下放置了 1 个图像按钮 单击该图像按钮 即 查看 按钮 时 我想在新窗口中打开所选文件 这是我的代码 protected void
  • 在 C 语言中替换宏内的宏

    我正在尝试使代码部分可重用 我下面的评论片段没有达到我想要的效果 define NAME ABC define LOG SIZE NAME LEN 我想LOG SIZE决心ABC LEN 我尝试过使用 但没能让它发挥作用 LOG SIZE在
  • 如果在代码中添加元素,“FindName”将不起作用

    在 WPF 应用程序中 如果在 XAML 中声明 ContentControl
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了
  • WinForms - 加载表单时如何使用 PaintEventArgs 运行函数?

    我试图理解图形 在 Graphics FromImage 文档中 它有这样的示例 private void FromImageImage PaintEventArgs e Create image Image imageFile Image
  • 如何测试某些代码在 C++ 中无法编译? [复制]

    这个问题在这里已经有答案了 可能的重复 单元测试编译时错误 https stackoverflow com questions 605915 unit test compile time error 我想知道是否可以编写一种单元测试来验证给
  • 将日期时间显示为 MM/dd/yyyy HH:mm 格式 C#

    在数据库中 日期时间以 MM dd yyyy HH mm ss 格式存储 但是 我想以 MM dd yyyy HH mm 格式显示日期时间 我通过使用 String Format 进行了尝试 txtCampaignStartDate Tex
  • 不使用放置 new 返回的指针时的 C++ 严格别名

    这可能会导致未定义的行为吗 uint8 t storage 4 We assume storage is properly aligned here int32 t intPtr new void storage int32 t 4 I k
  • 当 Verb="runas" 时设置 ProcessStartInfo.EnvironmentVariables

    我正在开发一个 C 应用程序 我需要创建变量并将其传递给新进程 我正在使用ProcessStartInfo EnvironmentVariables 新进程必须提升运行 因此我使用 Verb runas var startInfo new
  • 值和类型的简洁双向静态 1:1 映射

    我将从我想象如何使用我想要创建的代码开始 它不必完全像这样 但它是我在标题中所说的 简洁 的一个很好的例子 就我而言 它是将类型映射到相关的枚举值 struct bar foo

随机推荐

  • Visual Studio 的 Python 工具上的 Pytest

    可以在 Visual Studio 2010 上调试使用 pytest 库的 python 测试吗 我在解释器参数上添加了 m pytest 但未命中断点 我只能运行测试脚本而不对其进行调试 Pytest 建议创建一个独立的启动脚本 if
  • 将 Rust 应用程序与不在运行时链接器搜索路径中的动态库链接

    我有一个共享库 我想将其动态链接到几个单独的二进制 Cargo 应用程序 我使用以下命令将其位置包含在链接器中 L path to dir格式并且应用程序可以正确编译 并且我期望二进制大小显着减小 但是 当使用检查生成的二进制文件时ldd
  • 查找两个列表相同的从 1 开始的位置

    挑战在于编写一个函数来比较两个相当小的整数列表 每个列表大多少于 10 个元素 一个列表可能类似于 self 0 0 1 2 要与之比较的列表可能类似于以下示例之一 other1 other2 0 0 1 other3 0 0 1 2 0
  • 将输出写入打开 exe 的目录

    我有一个表格exe 现在单击按钮我希望它将文件保存到打开它的位置 例如如果我给这个exe给您 您将其复制到 C 盘文件夹名称 la la 然后将文件保存到 C 盘文件夹名称 la la 目前我正在尝试这个可行的方法 但我不希望它再提供目录路
  • 错误“框架不在模块中。”在 Xamarin.Forms - Android 项目中

    每当涉及到这一行时 就会出现以下错误 using var client new HttpClient var json await client GetStringAsync http mvalivros azurewebsites net
  • 使用 Docker 和 PHP 从 env 文件加载环境变量

    如何使用 Docker 文件中设置的 dotenv 变量传递给 Php 应用程序 最近尝试使用带有一组键配对值的 env 文件来跨不同的配置文件使用 但注意到 Docker Wordpress 映像并不容易设置 虽然在节点等中设置起来相当简
  • 如何判断PDF是横向还是纵向

    有没有工具可以确定 PDF 是横向还是纵向 我目前看过pdfbox and Itext为此 但似乎我找不到它 请告知他们是否支持这一点 使用提取 PDF 页面信息Origami提供的信息是 pdf 页面有一定程度的旋转 以下是 Origam
  • 在项目模板中包含对我自己的程序集的引用的最佳方法是什么?

    我们已经用 C 开发了一个库 现在我希望创建一个项目模板来帮助正确使用该库 我希望新项目包含对库程序集的引用 但不希望将程序集部署到 GAC 或者依赖于驻留在某个特定位置的程序集 我的想法是将 dll 包含在项目模板 zip 文件中 这意味
  • NVelocity 找不到模板

    我在 ASP NET MVC 应用程序中使用 NVelocity 时遇到一些困难 我用它作为生成电子邮件的一种方式 据我所知 我传递的详细信息都是正确的 但它无法加载模板 这是代码 private const string defaultT
  • 如何在 Electron 框架中使用登录事件?

    我需要一些帮助来理解如何Event login Electron 框架中的功能有效 它是浏览器中常见的密码自动填充 记住密码功能的低级实现吗 我想用它来自动填充网页登录流程中的密码 例如 const electron require ele
  • 如何使用 Selenium2Library 在机器人级别向 chromedriver 添加扩展

    我想在我的机器人套件设置中实例化 chromedriver 实例 但我需要在浏览器启动时安装扩展 通过简单地将 chromeoptions 添加到我的 webdriver 实例中 我可以轻松地在 Python 级别执行此操作 但我需要在机器
  • 在 c 中将数组转换为结构体,反之亦然

    令其为以下结构 typedef struct int x int y st 我可以将 int 数组 转换 为 struct st st z int t 2 t 0 0 t 1 1 z st t printf d d n z x z y 那么
  • 条纹 RedirectResolution 重定向到 https url

    假设用户使用 https 访问 stripes action1 一旦action1处理完成 它使用RedirectResolution重定向到action2 此时 浏览器会收到一个 302 to action2 其中包含 http 而不是
  • ASP.NET core 3.1:ConfigureAppConfiguration 是否与 launchSettings.json 交互?

    使用 kestrel 从 Visual Studio 2019 启动 ASP NET core 3 1 Web 应用程序时 我遇到了奇怪的行为 我的意思是启动配置文件not使用 IIS Express 我创建了一个最小的应用程序来重现该问题
  • 三.js raycaster 交集

    我编写了下面的代码来获取与 3d 形状的交点 它工作得很好 但如果有两个与形状的交点 它只返回最远的交点 而我需要与形状最近的交点 我怎样才能到达最近的十字路口 here I create a cube var geometry0 new
  • 如何从字符串中删除特定单词?

    我有一个 NSString str 具有值 我喜欢编程和游戏 我必须从字符串中删除 I like 和 and 这样它看起来应该像 编程游戏 我该怎么做 有什么想法吗 NSString newString I like Programming
  • Django 使用动态 SMTP 设置发送电子邮件

    我正在尝试在管理员中配置 EMAIL HOST 设置 我将创建一个包含必填字段的模型 例如 EMAIL HOST EMAIL HOST USER EMAIL HOST PASSWORD EMAIL PORT 但是我如何使用 send mai
  • python os.walk到一定级别[重复]

    这个问题在这里已经有答案了 我想构建一个程序 使用一些基本代码来读取文件夹并告诉我该文件夹中有多少文件 目前我是这样做的 import os folders Y path1 Y path2 Y path3 for stuff in fold
  • 使用 firebase 集合中的键值对填充反应选择选项数组

    我正在尝试在我的 React 应用程序中使用选项数组 该数组使用 React Select 作为表单 并将选项存储在 Firebase 集合中 当我在表单中定义一个 const 并使用我用键值对定义的选项数组时 这一切都很好 但我很难弄清楚
  • 仅使用按位函数求出表示 2 的补码需要多少位

    我们可以假设 int 是 2 的补码的 32 位 唯一合法的运营商是 gt 此时我正在使用暴力 int a 0x01 x x 1 gt gt 1 have tried with just x instead of x 1 as well a