位运算在Android中的使用场景

首先说一下基本位运算知识:

位运算:位运算就是把数字用二进制表示之后,对每一位上0或者1的运算。

位运算总共只有5种运算:与、或、异或、左移、右移。如下表:

位运算

左移运算:

左移运算 左移n位的时候,最左边的n位将被丢弃,同时在最右边补上n个0.比如:

00001010 << 2 = 00101000
10001010 << 3 = 01010000

右移运算:

 右移运算符m>>n表示把m右移n位。右移n位的时候,最右边的n位将被丢弃。但右移时处理最左边位的情形要稍微复杂一点。这里要特别注意,如果数字是一个无符号数值,则用0填补最左边的n位。如果数字是一个有符号数值,则用数字的符号位填补最左边的n位。也就是说如果数字原先是一个正数,则右移之后再最左边补n个0;如果数字原先是负数,则右移之后在最左边补n个1.下面是堆两个8位有符号数作右移的例子:

00001010 >> 2 = 00000010
10001010 >> 3 = 11110001

关于移位的运算有这样的等价关系:

把整数右移一位和把整数除以2
a << = n ; //a左移一位等效于a = a * 2^n;

进制之间转换:

主要是2进制 8进制 16进制 之间的转换
16进制转换2进制 : 16进制每一位 对应 二进制中的四位
0xF4 ——– 1111 0100
8进制转换2进制 : 8进制每一位 对应二进制中的三位
364 ———011 110 100
10进制转换2进制:
这个我就不多说了一张图就明白
10to2
那么10 转换为2进制 从下向上读就是01010

位运算在Android中的使用场景

之前博客在介绍MeasureSpec和TypeValue的时候都一定程度说到到位运算,如果还不知道的话,可参考:

http://blog.csdn.net/wning1/article/details/64497446
http://blog.csdn.net/wning1/article/details/64137354

拿MesureSpec来说吧!子View需要复写onMeasure(),对于父布局推荐的大小和模式,可以通过MeasureSpec的getMode()和getSize()方法去获取,想象一下如果不使用位运算的这种形式,我们还可以采用那种方式?定义一个类对象包括int类型size 和int类型mode 两个参数也行。那么为啥要用位运算来计算呢?答案:节省内存。4个字节就能干的事情何必要8个字节去做呢

这几天我在Android源码又看到了一个位运算相关代码:

Fragment 如果要跳转到一个Activity并对Activity返回进行数据处理那么我们会选择调用startActivityForResult方法,以下为部分代码(compileSdkVersion 25):

Fragment 类

  public void startActivityForResult(Intent intent, int requestCode) {
        startActivityForResult(intent, requestCode, null);
    }

    public void startActivityForResult(Intent intent, int requestCode, @Nullable Bundle options) {
        if (mHost == null) {
            throw new IllegalStateException("Fragment " + this + " not attached to Activity");//mHost即为Fragment绑定的Activity对象
        }
        mHost.onStartActivityFromFragment(this /*fragment*/, intent, requestCode, options);//调用FragmentActivity中的onStartActivityFromFragment
    }

FragmentActivity类

   @Override
        public void onStartActivityFromFragment(Fragment fragment, Intent intent, int requestCode) {
            FragmentActivity.this.startActivityFromFragment(fragment, intent, requestCode);
        }

  public void startActivityFromFragment(Fragment fragment, Intent intent,
            int requestCode) {
        startActivityFromFragment(fragment, intent, requestCode, null);
    }

   public void startActivityFromFragment(Fragment fragment, Intent intent,
            int requestCode, @Nullable Bundle options) {
        mStartedActivityFromFragment = true;
        try {
            if (requestCode == -1) {
                ActivityCompat.startActivityForResult(this, intent, -1, options); //默认startActivity 传递的requestCode == -1
                return;
            }
            checkForValidRequestCode(requestCode);
            int requestIndex = allocateRequestIndex(fragment);
            ActivityCompat.startActivityForResult(
                    this, intent, ((requestIndex + 1) << 16) + (requestCode & 0xffff), options);
        } finally {
            mStartedActivityFromFragment = false;
        }
    }

  static void checkForValidRequestCode(int requestCode) {
        if ((requestCode & 0xffff0000) != 0) {
            throw new IllegalArgumentException("Can only use lower 16 bits for requestCode");
        }
    }

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        mFragments.noteStateNotSaved();
        int requestIndex = requestCode>>16;
        if (requestIndex != 0) {
            requestIndex--;

            String who = mPendingFragmentActivityResults.get(requestIndex);
            mPendingFragmentActivityResults.remove(requestIndex);
            if (who == null) {
                Log.w(TAG, "Activity result delivered for unknown Fragment.");
                return;
            }
            Fragment targetFragment = mFragments.findFragmentByWho(who);
            if (targetFragment == null) {
                Log.w(TAG, "Activity result no fragment exists for who: " + who);
            } else {
                targetFragment.onActivityResult(requestCode & 0xffff, resultCode, data);
            }
            return;
        }

        super.onActivityResult(requestCode, resultCode, data);
    }

可以看到Fragment中调用startActivityForResult最终会调用到FragmentActivity中的startActivityFromFragment,如果requestCode!= -1 则调用checkForValidRequestCode进行code 数值判断,requestCode为int类型,requestCode & 0x ffff0000 如果不为0则说明requestCode高16位上至少1位为1也就是说数值肯定已经超过了65535。则会抛出参数非法异常,那么为什么不让用高16位呢?我们接向下看。 ((requestIndex + 1) << 16) + (requestCode & 0xffff) 重新做为了requestCode值,requestIndex + 1 向做移动了16位然后和旧的requetCode合并,那么现在新的requestCode的低16上存储的是真实的requestCode值,而高16则是存储的fragment的index,怪不得不让我们使用高16位呢。

在onActivityResult方法可以看到requestCode向右移动16位还原fragment的index,求出fragment如果fragment!=null则调用fragment的onActivityResult方法,否则回调给Activity。

ok,到这fragment这部分源码就已经分析完毕了,相信对位运算有了更加深刻的理解。

项目运用

以下为项目中蓝牙连接状态相关代码:

        /** 处于已断开状态时 */
        public static final int UNCONNECT = 1;

        /** 处于扫描状态时 */
        public static final int SEARCHING = 1 << 1;

        /** 处于正在连接时 */
        public static final int CONNECTING = 1 << 2;

        /** 处于已连接闲置状态时 */
        public static final int IDLE = 1 << 3;

        /** 处于正在断开状态时 */
        public static final int DISCONNECTING = 1 << 4;

        /** 处于工作状态时 */
        public static final int WORKING = 1 << 5;

        /** 处于闲置,或者工作状态集时 */
        public static final int MASK_CONNECTED = IDLE | WORKING;

        /** 处于扫描,或者连接,或者正在断开状态集时 */
        public static final int MASK_BUSY_CONNECTING = SEARCHING | CONNECTING | DISCONNECTING;

我如果要想判断设备是否处于连接状态只需要 state & MASK_CONNECTED != 0,是否处于连接状态只需要state & MASK_CONNECTING != 0 即可。

想象一下传统的做法应该是所有的状态都定义成int类型,如果要判断是否处于连接状态,我们需要这样做 state == SEARCHING || state ==CONNECTING || state == DISCONNECTING .

孰优孰劣,一目了然,ok,关于位运算今天就记录到这。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
android游戏编程入门 《Android4游戏编程入门经典》是2012年清华大学出版社出版的图书,作者是(美)策希纳(Zechner,M.),无(美)格林(Green,R.)。 第1章 Android,后起之秀 1   1.1 Android简介 1   1.2 版本分裂 3   1.3 谷歌的角色 3   1.3.1 Android开源项目 3   1.3.2 Android Market 4   1.3.3 挑战赛、设备播种计划   和谷歌I/O 4   1.4 Android的功能和体系结构 5   1.4.1 内核 6   1.4.2 运行库和Dalvik虚拟机 6   1.4.3 系统库 7   1.4.4 应用程序框架 8   1.5 软件开发工具包 8   1.6 开发人员社区 9   1.7 设备,设备,设备 9   1.7.1 硬件 9   1.7.2 设备的范围 10   1.8 所有设备之间的兼容性 15   1.9 不同的手机游戏 15   1.9.1 人手一台游戏机 16   1.9.2 随时上网 16   1.9.3 普通用户与游戏迷 17   1.9.4 市场很大,开发人员很少 17   1.10 小结 18   第2章 从Android SDK开始 19   2.1 搭建开发环境 19   2.1.1 安装JDK 20   2.1.2 安装Android SDK 20   2.1.3 安装Eclipse 21   2.1.4 安装ADT Eclipse插件 22   2.1.5 Eclipse快速浏览 23   2.1.6 一些实用的Eclipse快捷键 24   2.2 Android环境下的Hello World 25   2.2.1 创建项目 25   2.2.2 进一步分析项目 26   2.2.3 编写应用程序代码 27   2.3 运行和调试Android应用   程序 29   2.3.1 连接设备 29   2.3.2 创建一个Android虚拟   设备 29   2.3.3 运行应用程序 30   2.3.4 调试应用程序 32   2.3.5 LogCat和DDMS 34   2.3.6 使用ADB 36   2.4 小结 37   第3章 游戏开发基础 39   3.1 游戏类型 39   3.1.1 休闲游戏 40   3.1.2 益智游戏 41   3.1.3 动作和街机游戏 42   3.1.4 塔防游戏 44   3.1.5 创新 45   3.2 游戏设计:笔比代码更强大 46   3.2.1 游戏的核心机制 46   3.2.2 一个故事和一种艺术风格 47   3.2.3 画面和切换 48   3.3 代码:具体细节 52   3.3.1 应用程序和窗口管理 52   3.3.2 输入 53   3.3.3 文件I/O 56   3.3.4 音频 57   3.3.5 图形 60   3.3.6 游戏框架 69   3.4 小结 75   第4章 面向游戏开发人员的Android 77   4.1 定义一个Android应用程序:   清单文件 77   4.1.1 <manifest>元素 78   4.1.2 <application>元素 79   4.1.3 <activity>元素 80   4.1.4 <uses-permission>元素 82   4.1.5 <uses-feature>元素 83   4.1.6 <uses-sdk>元素 84   4.1.7 10个简单步骤建立Android   游戏项目 84   4.1.8 市场过滤器 86   4.1.9 定义游戏图标 87   4.2 Android API基础 87   4.2.1 创建测试项目 88   4.2.2 活动的生命周期 91   4.2.3 处理输入设备 96   4.2.4 文件处理 110   4.2.5 音频编程 116   4.2.6 播放音效 116   4.2.7 音乐流 119   4.2.8 基本图形编程 122   4.3 最佳实践 143   4.4 小结 144   第5章 Android游戏开发框架 145   5.1 制定计划 145   5.2 AndroidFileIO类 146   5.3 AndroidAudio、AndroidSound   和AndroidMusic 147   5.4 AndroidInput和Accelerometer-   Handler 152   5.4.1 AccelerometerHandler:手机   哪一面朝上 152   5.4.2 CompassHandler 153   5.4.3 Pool类:重用相当有用 154   5.4.4 KeyboardHandler 156   5.4.5 触摸处理程序 160   5.4.6 AndroidInput:优秀的   协调者 167   5.5 AndroidGraphics和   AndroidPixmap 169   5.5.1 处理不同屏幕大小和   分辨率的问题 169   5.5.2 AndroidPixmap:人物的   像素 174   5.5.3 AndroidGraphics:满足   绘图需求 174   5.5.4 AndroidFastRenderView 178   5.6 AndroidGame:合并所有   内容 180   5.7 小结 184   第6章 Mr. Nom入侵Android 185   6.1 创建资源 185   6.2 建立项目 187   6.3 MrNomGame:主要活动 187   6.3.1 资源:便捷的资源存储 188   6.3.2 设置:跟踪用户的选项设置   和高分榜 189   6.3.3 LoadingScreen:从磁盘获取   资源 191   6.4 主菜单画面 192   6.5 HelpScreen类 195   6.6 高分榜画面显示 197   6.6.1 渲染数字 198   6.6.2 画面的实现 199   6.7 抽象 201   6.7.1 抽象Mr. Nom的世界:   模型、视图、控制器 201   6.7.2 GameScreen类 211   6.8 小结 218   第7章 OpenGL ES介绍 219   7.1 OpenGL ES概述以及关注它的   原因 219   7.1.1 编程模型:一个比喻 220   7.1.2 投影 221   7.1.3 规范化设备空间和视口 223   7.1.4 矩阵 223   7.1.5 渲染管道 224   7.2 开始之前 225   7.3 GLSurfaceView:从2008年开始,   事情变得简单了 225   7.4 GLGame:实现游戏接口 228   7.5 绘制一个红色的三角形 235   7.5.1 定义视口 235   7.5.2 定义投影矩阵 235   7.5.3 指定三角形 238   7.5.4 综合示例 241   7.6 指定每个顶点的颜色 243   7.7 纹理映射:轻松地创建   壁纸 246   7.7.1 纹理坐标 247   7.7.2 上传位图 248   7.7.3 纹理过滤 249   7.7.4 释放纹理 250   7.7.5 有用的代码片段 251   7.7.6 启用纹理 251   7.7.7 综合示例 251   7.7.8 Texture类 253   7.8 索引顶点:重用是有好处的 255   7.8.1 代码整合 256   7.8.2 Vertices类 258   7.9 半透明混合处理 260   7.10 更多图元:点、线、条   和扇 263   7.11 2D变换:操作模型视图   矩阵 264   7.11.1 世界空间和模型空间 264   7.11.2 再次讨论矩阵 265   7.11.3 第一个使用平移的   示例 266   7.11.4 更多的变换 270   7.12 性能优化 273   7.12.1 测量帧率 273   7.12.2 Android 1.5平台下Hero的   奇特案例 275   7.12.3 使OpenGL ES渲染如此   慢的原因 275   7.12.4 移除不必要的状态   改变 276   7.12.5 减小纹理大小意味着需要   获取更少的像素 278   7.12.6 减少OpenGL ES/JNI方法的   调用 278   7.12.7 绑定顶点的概念 279   7.12.8 写在结束之前 282   7.13 小结 283   第8章 2D游戏编程技巧 285   8.1 写在开始 285   8.2 向量 286   8.2.1 使用向量 286   8.2.2 一点三角学的知识 288   8.2.3 实现一个向量类 289   8.2.4 一个简单的用法示例 292   8.3 2D物理定律浅析 296   8.3.1 牛顿和欧拉,永远的   好朋友 296   8.3.2 力和质量 297   8.3.3 理论上的运动 298   8.3.4 运动的实现 299   8.4 2D碰撞检测和对象表示 302   8.4.1 边界形状 303   8.4.2 构造边界形状 304   8.4.3 游戏对象的属性 306   8.4.4 宽阶段和窄阶段碰撞检测 307   8.4.5 一个详细的示例 313   8.5 2D照相机 324   8.5.1 Camera2D类 327   8.5.2 示例 328   8.6 纹理图集 329   8.7 纹理区域、精灵和批处理:   隐藏OpenGL ES 334   8.7.1 TextureRegion类 334   8.7.2 SpriteBatcher类 335   8.8 精灵动画 343   8.8.1 Animation类 344   8.8.2 示例 345   8.9 小结 348   第9章 Super Jumper:一个2D   OpenGL ES游戏 351   9.1 核心游戏机制 351   9.2 背景故事和艺术风格 352   9.3 画面和切换 352   9.4 定义游戏世界 353   9.5 创建资源 355   9.5.1 UI元素 355   9.5.2 使用点阵字体处理文本 356   9.5.3 游戏元素 358   9.5.4 用于救援的纹理图集 359   9.5.5 音乐与音效 360   9.6 实现Super Jumper 361   9.6.1 Assets类 361   9.6.2 Settings类 364   9.6.3 主活动 366   9.6.4 Font类 367   9.6.5 GLScreen 369   9.6.6 主菜单画面 369   9.6.7 帮助画面 372   9.6.8 高分画面 374   9.6.9 模拟类 377   9.6.10 游戏画面 390   9.6.11 WorldRenderer类 397   9.7 是否需要优化 401   9.8 小结 402   第10章 OpenGL ES:进入3D   世界 403   10.1 准备工作 403   10.2 3D的顶点 404   10.2.1 Vertices3:存储3D空间   位置 404   10.2.2 示例 406   10.3 透视投影:越近则越大 409   10.4 z-buffer:化混乱为有序 411   10.4.1 完善上一个例子 412   10.4.2 混合:身后空无一物 413   10.4.3 z-buffer精度与   z-fighting 416   10.5 定义3D网格 417   10.5.1 立方体:3D的“Hello   World” 417   10.5.2 一个示例 419   10.6 矩阵和变换 422   10.6.1 矩阵堆栈 423   10.6.2 用矩阵堆栈实现分层   系统 425   10.6.3 木箱太阳系的简单   实例 425   10.7 小结 433   第11章 3D编程技巧 435   11.1 准备工作 435   11.2 3D的向量 436   11.3 OpenGL ES的光照 440   11.3.1 光照的工作机制 440   11.3.2 光源 441   11.3.3 材质 442   11.3.4 OpenGL ES如何对光照   过程进行运算:顶点   法线 442   11.3.5 实践 443   11.3.6 关于OpenGL ES光照   应用的一些建议 456   11.4 材质变换(Mipmapping) 456   11.5 简单的照相机 460   11.5.1 第一人称照相机或欧拉   照相机 460   11.5.2 一个欧拉照相机的示例 463   11.5.3 跟随照相机 468   11.6 加载模块 470   11.6.1 Wavefront OBJ格式 470   11.6.2 OBJ加载器的实现 471   11.6.3 使用OBJ加载器 475   11.6.4 关于加载模型的一些   建议 475   11.7 3D的一些物理知识 476   11.8 碰撞检测与3D的对象   表达法 477   11.8.1 3D的边界形状 477   11.8.2 边界球重叠测试 477   11.8.3 GameObject3D与Dynamic-   GameObject3D 478   11.9 小结 479   第12章 Droid Invaders游戏 481   12.1 游戏的核心机制 481   12.2 游戏的故事背景与艺术   风格 483   12.3 屏幕与场景切换 483   12.4 定义游戏世界 484   12.5 创建资源 485   12.5.1 用户界面的资源 485   12.5.2 游戏资源 486   12.5.3 音效与音乐 488   12.6 开始编写代码 488   12.7 Assets类 489   12.8 Settings类 492   12.9 主活动 493   12.10 主菜单 494   12.11 游戏设置画面 496   12.12 模拟类 499   12.12.1 Shield类 499   12.12.2 Shot类 500   12.12.3 Ship类 500   12.12.4 Invader类 502   12.12.5 World类 505   12.13 GameScreen类 510   12.14 WorldRender类 516   12.15 游戏优化 521   12.16 小结 522   第13章 发布游戏 523   13.1 关于测试 523   13.2 成为注册开发人员 524   13.3 给游戏的APK包签名 524   13.4 将游戏发布至Market 527   13.4.1 上传资源 527   13.4.2 产品详情 528   13.4.3 发布选项 528   13.4.4 发布 529   13.4.5 市场推广 529   13.5 开发人员控制台 529   13.6 小结 530   第14章 进阶内容 531   14.1 社交网络 531   14.2 位置识别 531   14.3 多玩家功能 532   14.4 OpenGL ES 2.0以及更多   内容 532   14.5 框架及引擎 532   14.6 网络资源 534   14.7 结束语 534
第1章 android,后起之秀  1.1 android简介  1.2 版本分裂  1.3 谷歌的角色  1.3.1 android开源项目  1.3.2 android market  1.3.3 挑战赛、设备播种计划和谷歌i/o  1.4 android的功能和体系结构  1.4.1 内核  1.4.2 运行库和dalvik虚拟机  1.4.3 系统库  1.4.4 应用程序框架  1.5 软件开发工具包  1.6 开发人员社区  1.7 设备,设备,设备  1.7.1 硬件  1.7.2 设备的范围  1.8 所有设备之间的兼容性  1.9 不同的手机游戏  1.9.1 人手一台游戏机  1.9.2 随时上网  1.9.3 普通用户与游戏迷  1.9.4 市场很大,开发人员很少  1.10 小结 第2章 从android sdk开始  2.1 搭建开发环境  2.1.1 安装jdk  2.1.2 安装android sdk  2.1.3 安装eclipse  2.1.4 安装adt eclipse插件  2.1.5 eclipse快速浏览  2.1.6 一些实用的eclipse快捷键  2.2 android环境下的hello world  2.2.1 创建项目  2.2.2 进一步分析项目  2.2.3 编写应用程序代码  2.3 运行和调试android应用程序  2.3.1 连接设备  2.3.2 创建一个android虚拟设备  2.3.3 运行应用程序  2.3.4 调试应用程序  2.3.5 logcat和ddms  2.3.6 使用adb  2.4 小结 第3章 游戏开发基础  3.1 游戏类型  3.1.1 休闲游戏  3.1.2 益智游戏  3.1.3 动作和街机游戏  3.1.4 塔防游戏  3.1.5 创新  3.2 游戏设计:笔比代码更强大  3.2.1 游戏的核心机制  3.2.2 一个故事和一种艺术风格  3.2.3 画面和切换  3.3 代码:具体细节  3.3.1 应用程序和窗口管理  3.3.2 输入  3.3.3 文件i/o  3.3.4 音频  3.3.5 图形  3.3.6 游戏框架  3.4 小结 第4章 面向游戏开发人员的android  4.1 定义一个android应用程序:清单文件  4.1.1 [manifest]元素  4.1.2 [application]元素  4.1.3 [activity]元素  4.1.4 [uses-permission]元素  4.1.5 [uses-feature]元素  4.1.6 [uses-sdk]元素  4.1.7 10个简单步骤建立android游戏项目  4.1.8 市场过滤器  4.1.9 定义游戏图标  4.2 android api基础  4.2.1 创建测试项目  4.2.2 活动的生命周期  4.2.3 处理输入设备  4.2.4 文件处理  4.2.5 音频编程  4.2.6 播放音效  4.2.7 音乐流  4.2.8 基本图形编程  4.3 最佳实践  4.4 小结 第5章 android游戏开发框架  5.1 制定计划  5.2 androidfileio类  5.3 androidaudio、androidsound和androidmusic  5.4 androidinput和accelerometer-handler  5.4.1 accelerometerhandler:手机哪一面朝上  5.4.2 compasshandler  5.4.3 pool类:重用相当有用  5.4.4 keyboardhandler  5.4.5 触摸处理程序  5.4.6 androidinput:优秀的协调者  5.5 androidgraphics和androidpixmap  5.5.1 处理不同屏幕大小和分辨率的问题  5.5.2 androidpixmap:人物的像素  5.5.3 androidgraphics:满足绘图需求  5.5.4 androidfastrenderview  5.6 androidgame:合并所有内容  5.7 小结 第6章 mr. nom入侵android  6.1 创建资源  6.2 建立项目  6.3 mrnomgame:主要活动  6.3.1 资源:便捷的资源存储  6.3.2 设置:跟踪用户的选项设置和高分榜  6.3.3 loadingscreen:从磁盘获取资源  6.4 主菜单画面  6.5 helpscreen类  6.6 高分榜画面显示  6.6.1 渲染数字  6.6.2 画面的实现  6.7 抽象  6.7.1 抽象mr. nom的世界:模型、视图、控制器  6.7.2 gamescreen类  6.8 小结 第7章 opengl es介绍  7.1 opengl es概述以及关注它的原因  7.1.1 编程模型:一个比喻  7.1.2 投影  7.1.3 规范化设备空间和视口  7.1.4 矩阵  7.1.5 渲染管道  7.2 开始之前  7.3 glsurfaceview:从2008年开始,事情变得简单了  7.4 glgame:实现游戏接口  7.5 绘制一个红色的三角形  7.5.1 定义视口  7.5.2 定义投影矩阵  7.5.3 指定三角形  7.5.4 综合示例  7.6 指定每个顶点的颜色  7.7 纹理映射:轻松地创建壁纸  7.7.1 纹理坐标  7.7.2 上传位图  7.7.3 纹理过滤  7.7.4 释放纹理  7.7.5 有用的代码片段  7.7.6 启用纹理  7.7.7 综合示例  7.7.8 texture类  7.8 索引顶点:重用是有好处的  7.8.1 代码整合  7.8.2 vertices类  7.9 半透明混合处理  7.10 更多图元:点、线、条和扇  7.11 2d变换:操作模型视图矩阵  7.11.1 世界空间和模型空间  7.11.2 再次讨论矩阵  7.11.3 第一个使用平移的示例  7.11.4 更多的变换  7.12 性能优化  7.12.1 测量帧率  7.12.2 android 1.5平台下hero的奇特案例  7.12.3 使opengl es渲染如此慢的原因  7.12.4 移除不必要的状态改变  7.12.5 减小纹理大小意味着需要获取更少的像素  7.12.6 减少opengl es/jni方法的调用  7.12.7 绑定顶点的概念  7.12.8 写在结束之前  7.13 小结 第8章 2d游戏编程技巧  8.1 写在开始  8.2 向量  8.2.1 使用向量  8.2.2 一点三角学的知识  8.2.3 实现一个向量类  8.2.4 一个简单的用法示例  8.3 2d物理定律浅析  8.3.1 牛顿和欧拉,永远的好朋友  8.3.2 力和质量  8.3.3 理论上的运动  8.3.4 运动的实现  8.4 2d碰撞检测和对象表示  8.4.1 边界形状  8.4.2 构造边界形状  8.4.3 游戏对象的属性  8.4.4 宽阶段和窄阶段碰撞检测  8.4.5 一个详细的示例  8.5 2d照相机  8.5.1 camera2d类  8.5.2 示例  8.6 纹理图集  8.7 纹理区域、精灵和批处理:隐藏opengl es  8.7.1 textureregion类  8.7.2 spritebatcher类  8.8 精灵动画  8.8.1 animation类  8.8.2 示例  8.9 小结 第9章 super jumper:一个2dopengl es游戏  9.1 核心游戏机制  9.2 背景故事和艺术风格  9.3 画面和切换  9.4 定义游戏世界  9.5 创建资源  9.5.1 ui元素  9.5.2 使用点阵字体处理文本  9.5.3 游戏元素  9.5.4 用于救援的纹理图集  9.5.5 音乐与音效  9.6 实现super jumper  9.6.1 assets类  9.6.2 settings类  9.6.3 主活动  9.6.4 font类  9.6.5 glscreen  9.6.6 主菜单画面  9.6.7 帮助画面  9.6.8 高分画面  9.6.9 模拟类  9.6.10 游戏画面  9.6.11 worldrenderer类  9.7 是否需要优化  9.8 小结 第10章 opengl es:进入3d世界  10.1 准备工作  10.2 3d的顶点  10.2.1 vertices3:存储3d空间位置  10.2.2 示例  10.3 透视投影:越近则越大  10.4 z-buffer:化混乱为有序  10.4.1 完善上一个例子  10.4.2 混合:身后空无一物  10.4.3 z-buffer精度与z-fighting  10.5 定义3d网格  10.5.1 立方体:3d的“helloworld”  10.5.2 一个示例  10.6 矩阵和变换  10.6.1 矩阵堆栈  10.6.2 用矩阵堆栈实现分层系统  10.6.3 木箱太阳系的简单实例  10.7 小结 第11章 3d编程技巧  11.1 准备工作  11.2 3d的向量  11.3 opengl es的光照  11.3.1 光照的工作机制  11.3.2 光源  11.3.3 材质  11.3.4 opengl es如何对光照过程进行运算:顶点法线  11.3.5 实践  11.3.6 关于opengl es光照应用的一些建议  11.4 材质变换(mipmapping)  11.5 简单的照相机  11.5.1 第一人称照相机或欧拉照相机  11.5.2 一个欧拉照相机的示例  11.5.3 跟随照相机  11.6 加载模块  11.6.1 wavefront obj格式  11.6.2 obj加载器的实现  11.6.3 使用obj加载器  11.6.4 关于加载模型的一些建议  11.7 3d的一些物理知识  11.8 碰撞检测与3d的对象表达法  11.8.1 3d的边界形状  11.8.2 边界球重叠测试  11.8.3 gameobject3d与dynamic-gameobject3d  11.9 小结 第12章 droid invaders游戏  12.1 游戏的核心机制  12.2 游戏的故事背景与艺术风格  12.3 屏幕与场景切换  12.4 定义游戏世界  12.5 创建资源  12.5.1 用户界面的资源  12.5.2 游戏资源  12.5.3 音效与音乐  12.6 开始编写代码  12.7 assets类  12.8 settings类  12.9 主活动  12.10 主菜单  12.11 游戏设置画面  12.12 模拟类  12.12.1 shield类  12.12.2 shot类  12.12.3 ship类  12.12.4 invader类  12.12.5 world类  12.13 gamescreen类  12.14 worldrender类  12.15 游戏优化  12.16 小结 第13章 发布游戏  13.1 关于测试  13.2 成为注册开发人员  13.3 给游戏的apk包签名  13.4 将游戏发布至market  13.4.1 上传资源  13.4.2 产品详情  13.4.3 发布选项  13.4.4 发布  13.4.5 市场推广  13.5 开发人员控制台  13.6 小结 第14章 进阶内容  14.1 社交网络  14.2 位置识别  14.3 多玩家功能  14.4 opengl es 2.0以及更多内容  14.5 框架及引擎  14.6 网络资源  14.7 结束语
### 回答1: 在Android,BLE(蓝牙低功耗)通信是通过GATT(通用属性)协议进行的。在处理BLE数据时,有时需要将Byte数据进行拆分。 首先,我们可以使用位运算来分离出Byte的高位和低位数据。通过右移和掩码操作,我们可以获取高位和低位的数值。例如,如果我们有一个Byte数据 b,我们可以通过以下代码来分离出高位和低位数据: int highBits = (b & 0xF0) >> 4; // 获取高位数据 int lowBits = b & 0x0F; // 获取低位数据 另外,在BLE通信,数据通常以字节流的方式传输。如果我们有一个字节流数据,并且我们需要将其拆分为单独的Byte数据,可以使用下面的代码: byte[] byteArray = {0x12, 0x34, 0x56, 0x78}; // 要拆分的字节流数据 for (byte b : byteArray) { int highBits = (b & 0xF0) >> 4; // 获取高位数据 int lowBits = b & 0x0F; // 获取低位数据 // 处理拆分后的数据 } 通过循环遍历字节流数据,我们可以将每个Byte数据拆分出来,并进行相应的处理操作。 需要注意的是,拆分Byte数据是根据具体的数据格式和需求而定的。这里提供的只是一种简单的拆分方法,具体需要根据实际场景来进行调整和扩展。 ### 回答2: 在 Android BLE 编程,有时候需要将一个 byte 数组拆分为多个字节传输或处理。以下是一种常见的方法来拆分一个 byte 数组: 1. 首先,我们需要一个 byte 数组来存储待拆分的数据。 2. 然后,我们需要指定每个拆分后的字节的大小,可以是任意大小,通常取决于具体需求。 3. 接下来,我们可以使用一个循环来迭代原始 byte 数组,并将每个字节按照指定的大小拆分。 4. 在每次循环迭代时,我们可以使用 Java 的 subarray 方法来创建一个新的 byte 数组,并仅包含当前拆分的字节。 5. 在每次迭代结束后,我们可以使用新的 byte 数组进行相应的处理或传输。 6. 循环结束后,我们将得到多个拆分后的 byte 数组,可以根据需求进行相应的处理。 需要注意的是,拆分后的字节数组可能大小不一,因此在后续处理时需要进行适当的处理。 这种拆分方法适用于需要将一个较大的 byte 数组按照固定大小进行拆分的情况,例如在 BLE 数据传输需要将数据拆分为较小分片传输。 总结起来,Android BLE 可以通过迭代循环和使用 subarray 方法来对一个 byte 数组进行拆分,得到多个拆分后的 byte 数组,用于后续处理或传输。 ### 回答3: 在Android开发,Ble(蓝牙低功耗)是一种用于进行蓝牙通信的技术。在进行Ble通信时,需要将数据拆分成字节(byte)进行传输。 拆分字节可以使用Java语言位运算操作。假设我们有一个需要发送的整数数值data,我们可以将它拆分成多个字节进行传输。具体过程如下: 1. 将整数数值data转换为字节数组byteArray:byte[] byteArray = ByteBuffer.allocate(4).putInt(data).array(); 这里使用ByteBuffer类将整数转换为字节数组。 2. 按照需要的字节长度进行拆分。例如,如果我们需要将整数data拆分成两个字节进行传输,可以使用如下代码: byte[] firstByte = new byte[]{byteArray[0]}; // 获取第一个字节 byte[] secondByte = new byte[]{byteArray[1]}; // 获取第二个字节 3. 将拆分后的字节传输给接收方。可以使用蓝牙通信的API将字节发送给接收方设备。 在接收方设备,我们可以通过接收到的字节来重建原始的整数数据。具体过程如下: 1. 将接收到的字节数组重新组合为整数数据。例如,如果我们接收到了两个字节的数据firstByte和secondByte,可以使用如下代码重建整数数据: int receivedData = (firstByte[0] & 0xFF) | (secondByte[0] << 8); 这里使用位运算操作,将两个字节重新组合为整数数据。 2. 使用得到的整数数据进行后续的处理。例如,可以根据具体的需求对数据进行解析、显示或存储等操作。 需要注意的是,在进行Ble通信时,数据的拆分和重组需要双方设备保持一致的拆分长度和顺序。此外,还需要确保设备的字节序(Big Endian或Little Endian)一致,以免导致数据解析错误。 总之,通过对字节(byte)的拆分和重组,我们可以在Android开发实现Ble通信的数据传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值