V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
thisnull
V2EX  ›  Java

为什么声明常量时候用十六进制?

  •  
  •   thisnull · 2014-10-13 09:20:47 +08:00 · 7631 次点击
    这是一个创建于 3488 天前的主题,其中的信息可能已经有所发展或是发生改变。
    private static final int XXXX = 0x00000001;

    RT?谁能解答,难道只是程序员的喜好.
    21 条回复    2014-10-14 05:56:31 +08:00
    holmesabc
        1
    holmesabc  
       2014-10-13 09:23:42 +08:00
    没有这种问题.
    看需求了。
    socket这一类的东西,直接面向byte的,可能就是hex
    其它的一般还是10进制
    sunocean
        2
    sunocean  
       2014-10-13 09:25:45 +08:00
    没什么区别 ,编译器处理后计算机看到的都是二进制。这么写估计在直接操作寄存器,方便阅读和改错。
    fising
        3
    fising  
       2014-10-13 09:33:06 +08:00
    更好的可读性。
    niboy
        4
    niboy  
       2014-10-13 09:37:17 +08:00
    有时候会用到位操作?与或操作标志位方便。0x00000001,0x00000010,0x00000100,这种?
    hekunhotmail
        5
    hekunhotmail  
       2014-10-13 09:47:03 +08:00
    socket 自定义协议时,会更方便。
    hekunhotmail
        6
    hekunhotmail  
       2014-10-13 09:47:36 +08:00
    我指得是表示更直观。
    thisnull
        7
    thisnull  
    OP
       2014-10-13 09:48:37 +08:00
    @niboy 都已经是常量应该不会用位操作吧.
    nybux
        8
    nybux  
       2014-10-13 09:52:25 +08:00
    如果是属性的话,经常会有or的操作。
    比如什么属性|什么属性
    写成16进制,就很容易辨识位的冲突,或者只标识一个位
    比如0x0100 0x0200 0x0400 0x800,如果见到0x0600,你知道有2位可能写错了
    如果10进制,给你看1536就不清楚里面bit的情况了
    semicircle21
        9
    semicircle21  
       2014-10-13 10:03:51 +08:00   ❤️ 1
    在需要 或操作的时候会这样, 容易看清 究竟哪些位被置位了.
    比如 0x730, 容易用肉眼分辨出 0x400, 0x200, 0x100, 0x020, 0x010 这些位生效了.
    如果给你 0x730 = 1840, 反应不出哪些位被置了.

    如果不需要或操作的情况下, 或者说不是属性的含义, 仅仅是分类的意义, 用 1,2,3,4 也很常见.
    dychenyi
        10
    dychenyi  
       2014-10-13 10:06:14 +08:00 via Android
    定义宏之类的,可以非常容易看出来,有时候属性要与和或,十进制很难算,要么就2进制,不过太长了。
    withrock
        11
    withrock  
       2014-10-13 10:27:17 +08:00
    因为可以把它们组合起来。
    tempask
        12
    tempask  
       2014-10-13 10:42:20 +08:00
    很可能这个常量常用于各种位操作,因此这样声明看起来更加清楚直接,否则你写成10进制,在用的地方看起来会比较费劲
    233
        13
    233  
       2014-10-13 13:29:17 +08:00
    用于位操作吧,尤其驱动相关代码这种情况更多
    A = 0x0001
    B = 0x0002
    C = 0x0004
    D = 0x0008
    jemyzhang
        14
    jemyzhang  
       2014-10-13 13:53:34 +08:00
    肯定是嵌入式C程序员写的,哈哈~硬件操作必须的
    thisnull
        15
    thisnull  
    OP
       2014-10-13 14:02:34 +08:00
    @jemyzhang 这是JAVA 写的
    thisnull
        16
    thisnull  
    OP
       2014-10-13 14:02:54 +08:00
    @233 java写的代码
    eslizn
        17
    eslizn  
       2014-10-13 16:32:53 +08:00
    @thisnull 也难怪你会问这种问题,java就不能位操作了?有些逻辑用位操作实现起来比较简单
    Mutoo
        18
    Mutoo  
       2014-10-13 16:58:20 +08:00
    这没什么,我还喜欢写成这样呢
    A = 1<<0;
    B = 1<<1;
    C = 1<<2;
    D = 1<<3;
    thisnull
        19
    thisnull  
    OP
       2014-10-13 20:52:17 +08:00
    @eslizn 我知道JAVA可以操作位移符, 只是好奇声明常量的时候为何用十六进制的而已.
    eslizn
        20
    eslizn  
       2014-10-13 22:49:29 +08:00
    @thisnull 你不觉得十六进制比十进制直观吗? 0xff 就是一个字节
    WhatIf
        21
    WhatIf  
       2014-10-14 05:56:31 +08:00 via Android
    因为对人脑来说2进制到16进制的互转比2进制到10进制的互转来得直接。你完全可以用10进制来写,但是每次阅读代码还费劲思考也是一个什么值,多累
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2258 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 04:22 · PVG 12:22 · LAX 21:22 · JFK 00:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.