- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
用 C 或 C++ 编写三进制计算机有多容易?
显然,标准逻辑运算符(如 &
、|
和 ^
)仅在使用二进制逻辑时才有意义。
对于整数值,C 标准指的是值范围,而 C++ 标准则提到位长度(例如,long 必须至少为 32 位长)。这如何适用于使用 trits(即三进制位)的计算机?
一般来说,使用稍作修改的 C/C++ 版本在三元架构上进行编程是否可行,还是应该从头开始设计一种新的编程语言?
需要考虑的重点是向后兼容性(二进制假设程序是否可以轻松编译为三元架构,或者是否需要模拟二进制数据存储?)以及 C/C++ 标准设计中隐含的假设。
最佳答案
[intro.memory]/1:
The fundamental storage unit in the C++ memory model is the byte. Abyte is at least large enough to contain any member of the basicexecution character set and the eight-bit code units of theUnicode UTF-8 encoding form and is composed of a contiguous sequenceof bits, the number of which is implementation-defined.
[basic/fundamental]/4:
Unsigned integers shall obey the laws of arithmetic modulo 2 [raisedto the power of] n where n is the number of bits in the valuerepresentation of that particular size of integer.
此外,位域和填充位是经常使用的概念。
左移、右移等运算符也指位,按位与、按位或和按位异或根据定义是在位级别进行操作的运算,假设每个位为真或假。
我们可以想象,该标准可以使用另一个术语来指定架构中最小的信息,其方式与字节(字节,尽管最常见的是 8 位)的方式类似。标准中没有这样定义,因此该标准可以很好地适用于具有 10 位字节的机器。
然而,后果将是可怕的:
例如,在许多算法中,假设左移乘以 2 的幂,突然间,它会乘以 3 的幂。右移也是如此。所以很多现有的代码将不再工作。
按位运算没有为 trits 定义:它们只为二进制位定义。因此,标准必须以某种方式重新定义它们(例如通过使用某种 2 数学幂来模拟原始行为)。同样,某些现有代码有可能被破坏,特别是与类次结合使用时。
自从 Norbert Wiener 于 1948 年出版了富有远见的著作“控制论”(!!!)以来,二进制系统的替代品已经毫无疑问是存在的。在“计算机和神经系统”一章中,他很好地解释了为什么数值机器比模拟机器更准确、更高效,并且在数值机器中,二进制算术优于其他机器,因为它更简单,更快,此外easier and cheaper to implement 。目前,没有人能够证明相反的情况,因此很快就看不到三元计算机架构。
Peter 在评论中指出,实现只需提供 C++ 标准中定义的抽象机的指定行为即可。根据 [intro.abstract]/5 的说法,这是正确的。但我的观点是,这只是三元机器的理论真理。
二进制模型在标准的许多地方都是如此强烈的假设,并且与寻址方案交织在一起,以至于我会假装不可能在三进制机器上以高效且一致的方式进行模拟。
只是为了说明字节定义的问题:它需要 6 个 trit 才能满足一个字节的要求。然而,6 个 trit 对应于 9.5 位。为了使一个字节对应于标准要求的连续位数,您需要它是 s trits,以便 pow(3,s) == pow(2,n)。该方程无解。或者,您可以说一个字节是存储在 6 个 trit 中的 9 位,并且您只是忽略一些三进制值。但由于字节用于存储指针,您也会忽略一些内存范围。因此,您需要一个映射函数来在字节存储的值和机器地址之间进行转换。但是硬件对齐限制又如何呢?这些可能与可以根据二进制模型表达的对齐不对应,等等......最后,您需要有一个缓慢的虚拟机,它完全通过软件模拟二进制架构(当然具有与二进制架构相同的性能水平)许多 x86 架构上的 MIPS 仿真器,因此可以用于教育目的)。我认为这可以符合标准,但不再符合我们的性能预期。
关于c++ - C 和 C++ 标准对假设的三元硬件架构的适应性如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55877752/
我想知道javascript中if的简码是什么? 就像在 PHP 中一样: $res = ($x > $y)? $x: $y; 它在 JavaScript 中的转换是什么? 最佳答案 在 javasc
请问为什么下面的代码会报错? 错误: numberOne > numberTwo ? return "true" : return "false"; ^
在我的代码中,我检查系统函数是否等于零,如果是我返回另一个值,如果不是,我返回测试值。 (class.verylongfunc(arg, arg) == 0) ? othervar : cla
在 PHP 中,有没有一种方法可以使用三元条件连接两个字符串? 当我尝试这样做时,我得到的只是 else 而不是所需的 something else。 最佳答案 像这样把整个三元运算符放在方括号中:
似乎在三元运算符中存在某种类型混淆。我知道这已在其他 SO 线程中得到解决,但它始终与可空值有关。另外,就我而言,我真的只是在寻找更好的方法。 我希望能够使用 proc.Parameters[PARA
有没有办法在不进行赋值或伪造赋值的情况下进行 java 三元运算? 我喜欢在执行一堆 if/then/else 时的简洁三元代码。 我希望能够基于 boolean 代数语句调用两个 void 函数之一
我正在使用 XSLT 和 XML 来生成输出文档。 我在数据中拥有的(以我无法控制的 XML 形式)如下: 4 我需要在计算中使用这些。我看到为这些提供默认值需要对文档执行转换以提供一个有点冗长的
这个问题已经有答案了: Ternary operators in JavaScript without an "else" (13 个回答) 已关闭 4 年前。 我一直使用这样的三元表达式,但我不喜欢
我在 VB.NET 中发现了一个可以轻松重现的简单错误: Dim pDate As Date? Dim pString As String = "" ' works fine as expected
所以,我有这段代码,它实际上有效: (散列将是这样的对象:{"bob"=> "12, "Roger"=> "15", etc},并且 isGood(key) 是调用函数 isGood ,如果玩家好或坏
是否有以下 JavaScript bool 三元表达式的简写语法: var foo = (expression) ? true : false 最佳答案 当然,您只想将表达式转换为 bool 值: v
在 Java 中,如果我在常规 if 中使用三元 if 运算符,例如: if ((x > y - z) ? true : callLongWaitedMethod(many, parameteres)
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 7 年前。 Improve
var test = "Hello World!"; 在 Java 10+ 中,上面的代码片段可以编译,test 在编译时被推断为 String。 但是,我们可以使用条件(三元)运算符来返回不同的类型
嗨,我尝试在渲染内部使用三元条件,但遇到一些错误,这是我的代码: render() { return ( (this.emai
这里我有以下 JavaScript 代码,带有两个值。 var w = $("#id1").val(); var h = $("#id2").val(); (w == h) ? (w=350 , h
我一直想知道如何用 C++ 兼容语言编写 "A ? B : C" 语法。 我认为它的工作方式类似于:(伪代码) If A > B C = A Else C = B 有没有经验丰富的 C++
考虑两个 vector ,A 和 B,大小为 n,7 <= n <= 23 . A 和B 都只包含-1、0 和1。 我需要一个计算A 和B 内积的快速算法。 到目前为止,我一直在考虑使用以下编码将
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
如果您一开始就讨厌三元条件运算符,则无需回复 ;) 我经常看到它与赋值表达式一起使用,例如: var foo = (some_condition) ? then_code : else_code; 但
我是一名优秀的程序员,十分优秀!