当前位置: 首页 > 知识库问答 >
问题:

用C代码编写二进制数制[副本]

益思博
2023-03-14

有可能吗?

共有1个答案

韩经武
2023-03-14

标准C没有定义二进制常量。我相信还有一个GNU扩展(在流行的编译器中,clang也对其进行了调整):0b前缀:

int foo = 0b1010;

如果您想坚持使用标准C,那么有一个选项:您可以结合一个宏和一个函数来创建一个几乎可读的“二进制常量”特性:

#define B(x) S_to_binary_(#x)

static inline unsigned long long S_to_binary_(const char *s)
{
        unsigned long long i = 0;
        while (*s) {
                i <<= 1;
                i += *s++ - '0';
        }
        return i;
}

然后您可以这样使用它:

int foo = B(1010);

以下代码:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>


#define B(x) S_to_binary_(#x)

static inline unsigned long long S_to_binary_(const char *s)
{
    unsigned long long i = 0;
    while (*s) {
        i <<= 1;
        i += *s++ - '0';
    }
    return i;
}

int main()
{
    int foo = B(001100101);

    printf("%d\n", foo);

    return 0;
}

已使用clang-o baz.s baz.c-wall-o3-s编译,并生成以下程序集:

    .section    __TEXT,__text,regular,pure_instructions
    .globl  _main
    .align  4, 0x90
_main:                                  ## @main
    .cfi_startproc
## BB#0:
    pushq   %rbp
Ltmp2:
    .cfi_def_cfa_offset 16
Ltmp3:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
Ltmp4:
    .cfi_def_cfa_register %rbp
    leaq    L_.str1(%rip), %rdi
    movl    $101, %esi               ## <= This line!
    xorb    %al, %al
    callq   _printf
    xorl    %eax, %eax
    popq    %rbp
    ret
    .cfi_endproc

    .section    __TEXT,__cstring,cstring_literals
L_.str1:                                ## @.str1
    .asciz   "%d\n"


.subsections_via_symbols

因此clang完全消除了对函数的调用,并将其返回值替换为101。干净利落吧?

 类似资料:
  • 问题内容: 我使用python 3,我尝试将二进制文件写入使用r + b的文件。 其中,binary是包含数字的列表。如何将其写入二进制文件? 最终文件必须看起来像b’x07 \ x08 \ x07 \ 谢谢 问题答案: 当您以二进制模式打开文件时,实际上就是在使用该类型。因此,当您写入文件时,您需要传递一个对象,而从文件中读取时,您将获得一个对象。相反,以文本模式打开文件时,您正在使用对象。 因

  • 这是一个考题,我想一定有更有效的方法。(我也知道有一种方法可以直接转换二进制数,而不需要经过二进制字符串,但我不知道如何转换)。 这就是问题所在: 给出了一个由Q字符组成的非空零索引字符串S。该字符串的周期是最小的正整数P,使得: P≤ Q/2和S[K]=S[kp]表示0≤ K 例如,8是“Codilityco”的时期。如果M是N的二进制表示的周期,则正整数M是正整数N的二进制周期。 例如,4是9

  • base64编码 # base64_b64encode.py import base64 import textwrap # Load this source file and strip the header. with open(__file__, 'r', encoding='utf-8') as input: raw = input.read() initial_data

  • 我刚刚创建了第一个使用JNI和NDK的Android应用程序,简单的Hello JNI。具有返回字符串的唯一函数。我签署了APK解包,如果我看到的.so文件似乎不是本地编译的。我想要一个二进制代码。我读取函数和字符串的名称。我的目标是使用SDK编写本机代码来隐藏未被proguard遮挡的字符串。我用的是Android Studio 2.1.2 建筑格拉德尔项目 Build.Gradle 应用 gr

  • 问题内容: 我知道用和 将小数转换为二进制(在这里我取32位结果的低16位)。 我想做的是另一种方法,并采用16位二进制补码二进制字符串并将其转换为十进制。 即 而不是 我该怎么做? 问题答案: 您需要将结果读取到中。 此打印。

  • 问题内容: 我从事Web编程已经有几年了,自那时以来,我还没有为桌面应用程序做任何编程,而且我已经忘记了很多事情。如果这太简单,请耐心等待。 现在我有这种情况: 我正在尝试将一些散列字存储在文件中。我想我应该为此使用二进制文件(如果我错了,请纠正我)。但是我不知道如何将单词写到文件中。我尝试了很多方法,但是当我读回文件并尝试解密单词时,我得到了。 有谁知道如何将单词写到文件中? PS:我使用以下代