我可以在 C 或 C 中使用二进制文字吗?

新手上路,请多包涵

我需要使用二进制数。

我试着写:

 const char x = 00010000;

但它没有用。

我知道我可以使用与 00010000 具有相同值的十六进制数,但我想知道 C++ 中是否有二进制数的类型,如果没有,是否有另一种解决方案我的问题?

原文由 hamza 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 643
2 个回答

您可以在等待 C++0x 时 使用 BOOST_BINARY 。 :) BOOST_BINARY 可以说比模板实现具有优势,因为它 也可以在 C 程序中使用(它是 100% 预处理器驱动的。)

要进行相反的操作(即以二进制形式打印出一个数字),您可以使用不可移植的 itoa 函数,或 实现您自己的

- 不幸的是,您不能使用 STL 流进行基数 2 格式化(因为 setbase 只会支持基数 8、10 和 16),但您 可以 使用 std::string 版本的 itoa ,或(更简洁,但效率略低) std::bitset

 #include <boost/utility/binary.hpp>
#include <stdio.h>
#include <stdlib.h>
#include <bitset>
#include <iostream>
#include <iomanip>

using namespace std;

int main() {
  unsigned short b = BOOST_BINARY( 10010 );
  char buf[sizeof(b)*8+1];
  printf("hex: %04x, dec: %u, oct: %06o, bin: %16s\n", b, b, b, itoa(b, buf, 2));
  cout << setfill('0') <<
    "hex: " << hex << setw(4) << b << ", " <<
    "dec: " << dec << b << ", " <<
    "oct: " << oct << setw(6) << b << ", " <<
    "bin: " << bitset< 16 >(b) << endl;
  return 0;
}

产生:

 hex: 0012, dec: 18, oct: 000022, bin:            10010
hex: 0012, dec: 18, oct: 000022, bin: 0000000000010010

另请阅读 Herb Sutter 的 The String Formatters of Manor Farm 进行有趣的讨论。

原文由 vladr 发布,翻译遵循 CC BY-SA 4.0 许可协议

我提名我的解决方案:

     #define B(x)                \
       ((((x) >>  0) & 0x01)    \
      | (((x) >>  2) & 0x02)    \
      | (((x) >>  4) & 0x04)    \
      | (((x) >>  6) & 0x08)    \
      | (((x) >>  8) & 0x10)    \
      | (((x) >> 10) & 0x20)    \
      | (((x) >> 12) & 0x40)    \
      | (((x) >> 14) & 0x80))

const uint8 font6[] = {
    B(00001110),    //[00]
    B(00010001),
    B(00000001),
    B(00000010),
    B(00000100),
    B(00000000),
    B(00000100),
    B(00000000),

我以这种方式定义 8 位字体和图形,但也可以使用更宽的字体。如果编译器支持,可以定义宏 B 以生成 0b 格式。操作:二进制数被解释为八进制,然后位被屏蔽并一起移位。中间值受编译器可以使用的最大整数的限制,我猜 64 位应该没问题。

它完全由编译器处理,不需要运行时代码。

原文由 vjalle 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏