V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zxCoder
V2EX  ›  问与答

编程语言里怎么没有 bit 这样的类型

  •  
  •   zxCoder · 2021-01-04 09:25:06 +08:00 · 3609 次点击
    这是一个创建于 1425 天前的主题,其中的信息可能已经有所发展或是发生改变。
    31 条回复    2021-01-05 09:49:35 +08:00
    weyou
        1
    weyou  
       2021-01-04 09:32:20 +08:00 via Android   ❤️ 1
    参见语言: 位域( bit-field )
    fengxuejuan
        2
    fengxuejuan  
       2021-01-04 09:34:17 +08:00   ❤️ 3
    建议去看 verilog,

    除了 bit 没别的类型。
    zhuyongqi9
        3
    zhuyongqi9  
       2021-01-04 09:49:03 +08:00
    C51 里有 /狗头
    raaaaaar
        4
    raaaaaar  
       2021-01-04 10:08:44 +08:00 via Android
    计算机不是以 byte 为最小单位吗
    clino
        5
    clino  
       2021-01-04 10:11:23 +08:00   ❤️ 1
    有没有 bit 是方式方法,但是应该首先考虑要解决什么问题,你要 bit 类型想解决的问题是什么呢?
    Takashi123
        6
    Takashi123  
       2021-01-04 10:35:30 +08:00
    位段
    SuperMild
        7
    SuperMild  
       2021-01-04 10:35:56 +08:00
    一个 bit 通常没有用啊,多个 bit 连起来就是 byte 或者二进制数字了。
    rainman777
        8
    rainman777  
       2021-01-04 10:38:05 +08:00
    bool
    opengps
        9
    opengps  
       2021-01-04 10:38:33 +08:00 via Android
    因为你学的是高级语言,你用的各种类型已经被封装过了
    rainman777
        10
    rainman777  
       2021-01-04 10:40:02 +08:00
    但是 bool 好像也是占 8bit...
    zxCoder
        11
    zxCoder  
    OP
       2021-01-04 10:44:26 +08:00
    @SuperMild 一些底层协议不是一般都是几位几位的算嘛
    lxilu
        12
    lxilu  
       2021-01-04 10:44:30 +08:00 via iPhone
    @opengps 汇编能直接控制 bit ?
    OysterQAQ
        13
    OysterQAQ  
       2021-01-04 10:46:43 +08:00
    内存机构的最小寻址单位为 1Byte
    updateing
        14
    updateing  
       2021-01-04 10:47:55 +08:00 via Android
    @zxCoder 协议里面操作 bit 的时候用的是位域。
    misaka19000
        15
    misaka19000  
       2021-01-04 10:52:36 +08:00
    @opengps #9 能不能操作 bit 看硬件不看语言
    agagega
        16
    agagega  
       2021-01-04 11:04:04 +08:00 via iPhone
    因为通常来说在语言里加入一个类型,在指令集上就需要对应的寄存器和一组相关的指令。很多指令集架构都不支持单独操作某个 bit 的指令,更没有只有 1 个 bit 的寄存器。而如果真的要表示 bit 的时候,用 byte 模拟就行了。你可以参考 LLVM 中不同目标平台对 i1 类型的处理。
    yolee599
        17
    yolee599  
       2021-01-04 11:11:39 +08:00
    Verilog HDL 了解一下?
    opengps
        18
    opengps  
       2021-01-04 11:16:35 +08:00
    @lxilu
    @misaka19000
    从道理上来讲,编程语言都得依赖底层 bit,只不过能否操纵得看是否这门语言对外留了处理方式,我用 C#开发车载 GPS 用途的 socket 服务器,有些通信包解析的时候,就是用的 bit 来标识传感器状态的,C#的 string 类有个 Convert 可以直接转换为二进制,然后拿到特定 bit 位的值是 0 还是 1 。
    至于 C#直接操作比特位,则需要在类前面加 unsafe 关键字,大部人学了 C#很久可能也没用到过这个,但是用到了异或校验等位运算的时候,就必然得用到了
    BingoXuan
        19
    BingoXuan  
       2021-01-04 11:20:33 +08:00
    用 long+bit mask 模拟就好了。硬件寄存器都是这样子,一个 byte 可能映射了 3-4 个功能,某个功能取决于某个 bit 的电平高低。
    systemcall
        20
    systemcall  
       2021-01-04 11:27:32 +08:00
    有的,c51 C 就支持 sbit
    嵌入式用的很多吧,按位寻址、字节寻址,都有的
    systemcall
        21
    systemcall  
       2021-01-04 11:28:00 +08:00
    @OysterQAQ #13
    看看 c51,可以按位寻址
    ruokw
        22
    ruokw  
       2021-01-04 12:52:56 +08:00 via Android
    内存寻址顶多到 byte,就算语言层面定一个 bit 类型,还是得寻址到 byte
    Jirajine
        23
    Jirajine  
       2021-01-04 13:31:58 +08:00 via Android
    一般来说 byte 用得比较多,二进制协议、格式等都是以 byte 为最小单位。
    fuchunliu
        24
    fuchunliu  
       2021-01-04 13:40:29 +08:00 via Android
    bit 一般操作寄存器才会用吧,不做硬件的给你这个类型,你还是占一字节内存,这不是脱了裤子放屁嘛
    icyalala
        25
    icyalala  
       2021-01-04 13:43:28 +08:00
    这到底还是历史问题。。

    曾经 Intel 还没出来的时候,不少处理器和磁带都是一次操作 6-bit 。
    Intel 4004 是按 4-bit chunks 来处理的,
    但是从 8086 开始,后面的新处理器基本都是用 8-bit byte 作为最小操作单位了,
    再往后随着 CPU 升级,实际 CPU 每次处理 bit 数是提升的,但是出于兼容考虑或者历史原因,byte 仍然是对外的最小处理单位。

    说起来 1byte 也不一定就等于 8bit 。。
    chitanda
        26
    chitanda  
       2021-01-04 14:02:32 +08:00
    char??
    letking
        27
    letking  
       2021-01-04 14:06:28 +08:00
    对大多数语言来说,你可以用位运算实现 bit 级别的控制和运算,但是空间占用上只能以 8bit 为最小单位了,再小也没必要了——最多也就浪费 7bit 的空间而已,没必要单独搞一个 bit 类型出来。
    b1eberg0n
        28
    b1eberg0n  
       2021-01-04 14:17:01 +08:00
    Erlang:?
    sampeng
        29
    sampeng  
       2021-01-04 14:38:34 +08:00 via iPhone
    如果接口文档里这没写:嗨,给我一个 32bit 的字符串。
    systemcall
        30
    systemcall  
       2021-01-04 21:02:01 +08:00
    @ruokw #22
    看硬件吧。有的就是可以按位寻址的,有的按字节、双字甚至别的方式寻址。和硬件实现有关系
    @chitanda #26
    char 什么时候是 bit 了?而且如果是现在的 PC,好像是会转成 int 之类的
    SmallTeddy
        31
    SmallTeddy  
       2021-01-05 09:49:35 +08:00
    计算机中使用的二进 bai 制数 du 共有 3 个单位:位,字节,字。
    位(bit)(b)音译为比特。位 bai 是计算机存储数 du 据的最小单位。一 zhi 个位只能表示 0 和 1 两种状态。
    字节(byte)音译为"拜特",常以大写字母"B"表示字节。字节是最基本的数据单位。8 位二进制数为一个字节。
    8bit ( 8b ) = 1byte ( 1B )之后就是 KB,MB,GB,TB
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5666 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 85ms · UTC 03:19 · PVG 11:19 · LAX 19:19 · JFK 22:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.