在C++中,我想知道为什么bool类型是8位长(在我的系统上),只有一位足以保存布尔值?
我曾经认为这是出于性能原因,但是在32位或64位机器上,寄存器为32或64位宽,性能优势是什么?
或者这只是这些"历史"原因之一?
在代码中,我有时会看到人们以十六进制格式指定常量,如下所示:
const int has_nukes = 0x0001;
const int has_bio_weapons = 0x0002;
const int has_chem_weapons = 0x0004;
// ...
int arsenal = has_nukes | has_bio_weapons | has_chem_weapons; // all of them
if(arsenal &= has_bio_weapons){
std::cout << "BIO!!"
}
Run Code Online (Sandbox Code Playgroud)
但是我在这里使用十六进制格式没有意义.有没有办法直接用二进制文件做?像这样的东西:
const int has_nukes = 0b00000000000000000000000000000001;
const int has_bio_weapons = 0b00000000000000000000000000000010;
const int has_chem_weapons = 0b00000000000000000000000000000100;
// ...
Run Code Online (Sandbox Code Playgroud)
我知道C/C++编译器不会编译它,但必须有一个解决方法吗?是否有可能在其他语言如Java?
我经常希望我能在c中做这样的事情:
val1 &= 0b00001111; //clear high nibble
val2 |= 0b01000000; //set bit 7
val3 &= ~0b00010000; //clear bit 5
Run Code Online (Sandbox Code Playgroud)
拥有这种语法似乎是C的一个非常有用的补充,没有我能想到的缺点,对于低级语言而言,这似乎是很自然的事情.
编辑:我看到了一些其他很好的选择,但是当有更复杂的面具时它们都会崩溃.例如,如果reg是一个控制微控制器上I/O引脚的寄存器,我想在我写入的reg = 0x46;同时将引脚2,3和7设置为高电平,但我不得不花10秒时间考虑它(而且我每次我在没有看一两天后阅读这些代码时,我可能不得不再花10秒钟,或者我可以写reg = (1 << 1) | (1 << 2) | (1 << 6);但我个人认为这不仅仅是写"reg = 0b01000110;".我同意它不会超出8位或16位架构.不是说我曾经需要制作32位掩码.
C++ 14似乎即将到来,编译器已经在尝试实现这个新版本的核心功能.我正在研究GCC对这些核心功能的支持,并注意到二进制文字部分:GCC实现了它们,但似乎在GNU二进制文字和C++ 14二进制文字之间有所区别.以下是两者的相应参考:
我试图找到他们两个之间的一些差异,因为GCC似乎有所作为,但找不到任何东西.你们中有谁知道更多可能的不兼容性吗?
我使用一个众所周知的模板来允许二进制常量
template< unsigned long long N >
struct binary
{
enum { value = (N % 10) + 2 * binary< N / 10 > :: value } ;
};
template<>
struct binary< 0 >
{
enum { value = 0 } ;
};
Run Code Online (Sandbox Code Playgroud)
所以你可以做二进制<101011011> :: value.不幸的是,对于无符号长整数,它有20位数的限制.
有没有人有更好的解决方案?
可能重复:
我可以在C或C++中使用二进制文字吗?
我正在学习C,我最近发现我们可以用不同的方式表示整数,如:
(假设i"人类可读"的值为512.)以下是表示:
int i = 512;
Run Code Online (Sandbox Code Playgroud)
int i = 01000;
Run Code Online (Sandbox Code Playgroud)
int i = 0x200;
Run Code Online (Sandbox Code Playgroud)
有点像int i = 1000000000b?这很有趣,但遗憾的是没有C编译器接受该值.
不应该0x00000100 = 4.
我知道0x00000001 = 1,因为2 ^ 0和0x00000010 = 2,因为2 ^ 1.我的想法有什么问题?
initVariable(&variable1, "variable1", "1, 2, 3", 0x00000100);
assertIntegerEquals(variable1.address, 4); // 0x00000100 = 4?
Run Code Online (Sandbox Code Playgroud)
我的断言失败了,因为它说256!= 4
我的代码中有很多内容#define.现在一个奇怪的问题已经悄然兴起.
我有这个:
#define _ImmSign 010100
Run Code Online (Sandbox Code Playgroud)
(我正在尝试模拟二进制数)
显然,我希望这个数字变成10100.但是当我使用这个数字时,它变成了4160.
这里发生了什么?我该如何阻止它?
额外
好的,这是因为语言将其解释为八进制.是否有一些聪明的方法来迫使语言将数字解释为整数?如果前导0定义了八进制,而0x定义了十六进制现在我想到它...
我们通过将0作为前缀并将十六进制设置为0x来初始化八进制.我们如何初始化二进制数的int变量?C中是否有二进制数的访问说明符?例如,对于八进制,%o,对于十六进制数,%x.