当前位置: 首页 > 面试题库 >

一字节的布尔值。为什么?

柳正志
2023-03-14
问题内容

在C
++中,为什么布尔需要一个字节来存储true或false,而只需要一位就足够了,例如0代表false,1代表true?(为什么Java也需要一个字节?)

其次,使用以下方法更安全

struct Bool {
    bool trueOrFalse : 1;
};

第三,即使是安全的,上述现场技术真的有帮助吗?既然我听说我们在那里节省了空间,但是编译器生成的访问它们的代码仍然比生成访问基元的代码更大,更慢。


问题答案:

为什么布尔只需要一个字节就可以存储真或假,而只需要一位就可以

因为C ++中的每个对象都必须是可单独寻址的*(也就是说,您必须能够有一个指向它的指针)。您不能寻址单个位(至少不是在常规硬件上)。

使用以下内容更安全?

这是“安全的”,但并没有取得太大的成就。

上面的现场技术真的有帮助吗?

否,出于与上述相同的原因;)

但是编译器生成的用于访问它们的代码仍然比生成访问基元的代码更大,更慢。

是的,这是真的。在大多数平台上,这需要访问包含的字节(或int任何其他字节),然后执行移位和位掩码操作以访问相关位。

如果您确实担心内存使用情况,可以使用std::bitsetC
++或BitSetJava中的打包位。

*除少数例外。



 类似资料:
  • 问题内容: 我遇到了这种语法: 这个带有两个点的语法是什么? 在哪里可以找到有关它的信息? 它仅适用于布尔值还是以其他不同方式实现? 问题答案: 是条件运算符。(不只是一部分,整个方法参数是示例中条件运算符的一种用法。) 它通常被称为三元运算符,但这只是其本质的一个方面-具有三个操作数- 而不是其名称。如果在Java中引入了另一个三元运算符,则该术语将变得模棱两可。之所以称为条件运算符,是因为它有

  • 我觉得这给了我很小的灵活性每当我使用这个函数。使用此函数时,我通常会查找元素的第一次出现,但它只返回,我发现这一点有些欠缺。 使用此函数的主要原因是每当找到元素时,都会循环,因此使用会失去作用,因为不会短路。是相同的。 我是遗漏了什么,还是必须使用循环来获取JavaScript中的第一个匹配元素?

  • 我在PostgreSQL表中有一个布尔列。在pgAdmin III中,表视图显示列的TRUE和FALSE。当我SQL选择*时,另一个窗口显示t和f。这是配置问题吗?它不应该也显示“真”和“假”吗? 然后我们来看看PHP。我有以下代码来处理这个布尔值(实际上我正在做一些不同的事情,但在这里简化了它): 数据库显示'FALSE',php读取'f'并将其视为'TRUE'。这是一种错误的配置,还是php总

  • 问题内容: 我有一个pojo类,其中标志之一是Boolean类型。 当此属性获取非布尔值(不是fastxml时)时,杰克逊会自动将输入值转换为。调试了几个小时后,我发现这是在setter方法中发生的。 如果此属性的输入值为非布尔值,我想传递自定义消息。我已经编写了自己的注释来验证此属性的输入值,并返回自定义消息(如果它不是布尔值,但是杰克逊在检查自定义验证器之前将其绑定)。 使用杰克逊版本>>>

  • 但是这个代码不起作用。编译器说 我在试图理解代码的问题是什么。我认为将返回一个布尔值流,我可以通过收集这些值。

  • 检查给定的参数是否是一个原生的布尔值。 使用 typeof 来检查一个值是否为一个布尔值。 const isBoolean = val => typeof val === 'boolean'; isBoolean(null); // false isBoolean(false); // true