编程语言里怎么没有 bit 这样的类型 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zxCoder
V2EX    问与答

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

  •  
  •   zxCoder 2021-01-04 09:25:06 +08:00 4004 次点击
    这是一个创建于 1791 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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     Solana     854 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 73ms UTC 19:28 PVG 03:28 LAX 11:28 JFK 14:28
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86