二进制代码

力扣 OJ 338. 比特位计数

家住魔仙堡 提交于 2020-02-08 19:18:08
题目: 给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。 示例 1: 输入: 2 输出: [0,1,1] 示例 2: 输入: 5 输出: [0,1,1,2,1,2] 进阶: 给出时间复杂度为O(n*sizeof(integer))的解答非常容易。但你可以在线性时间O(n)内用一趟扫描做到吗? 要求算法的空间复杂度为O(n)。 你能进一步完善解法吗?要求在C++或任何其他语言中不使用任何内置函数(如 C++ 中的 __builtin_popcount)来执行此操作。 代码: class Solution { public: vector<int> countBits(int num) { vector<int>ans; ans.insert(ans.end(), 0); for (int i = 1; i <= num; i++) { ans.insert(ans.end(), i % 2 + ans[i / 2]); } return ans; } }; 来源: CSDN 作者: csuzhucong 链接: https://blog.csdn.net/nameofcsdn/article/details/104220855

力扣 OJ 461. 汉明距离

时光总嘲笑我的痴心妄想 提交于 2020-02-08 15:47:19
题目: 两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。 给出两个整数 x 和 y,计算它们之间的汉明距离。 注意: 0 ≤ x, y < 231. 示例: 输入: x = 1, y = 4 输出: 2 解释: 1 (0 0 0 1) 4 (0 1 0 0) ↑ ↑ 上面的箭头指出了对应二进制位不同的位置。 代码: class Solution { public: int hammingWeight(uint32_t n) { int ans = 0; while (n) { n ^= (n&(-n)); ans++; } return ans; } int hammingDistance(int x, int y) { return hammingWeight(x^y); } }; 来源: CSDN 作者: csuzhucong 链接: https://blog.csdn.net/nameofcsdn/article/details/104220900

WCF技术剖析之十九:深度剖析消息编码(Encoding)实现(上篇)

淺唱寂寞╮ 提交于 2020-02-08 09:33:07
[爱心链接: 拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道《天天山海经》为此录制的节目视频(苏州话)] ]消息作为WCF进行通信的唯一媒介,最终需要通过写入传输层进行传递。而对消息进行传输的一个前提或者是一项必不可少的工作是对消息进行相应的编码。WCF提供了一系列可供选择的编码方式,它们分别在互操作和性能各具优势。在本篇文章我们将对各种编码方式进行消息的讨论。 从互操作性的角度来看,编码方法很大程度上决定了跨平台支持的能力。有的编码方式是平台无关的,有的则仅限于某种特定的平台。WCF提供了3种典型的编码方式:Binary、Text和MTOM。Binrary以二进制的方式进行消息的编码,但是仅限于.NET平台之间的通信;Text则提供平台无关的基于文本的编码方式。MTOM编码基于WS-MTOM规范,对于改善大规模二进制数据在SOAP消息的传输性能具有重大的意义,既然该编码方式遵循相应的规范,无疑这也是一种跨平台的编码方式。 在正式介绍WCF消息编码之前,我们很有必要了解如下几个实现编码的核心对象:XmlDictionary、XmlDictionary和XmlDIctionaryWriter。 一、XmlDictionary XmlDictionary,顾名思义,它是一个字典,它是从事编码和解码双方共享的一份“词汇表”。这样的说法可能有点抽象,我们不妨做一个类比。比如我说

序列化和反序列化

我怕爱的太早我们不能终老 提交于 2020-02-06 00:25:59
1, 摘要   序列化和反序列化几乎是工程师们每天都要面对的事情,但是要精确掌握这两个概念并不容易:一方面,它们往往作为框架的一部分出现而湮没在框架之中;另一方面,它们会以其他更容易理解的概念出现,例如加密、持久化。然而,序列化和反序列化的选型却是系统设计或重构一个重要的环节,在分布式、大数据量系统设计里面更为显著。恰当的序列化协议不仅可以提高系统的通用性、强健性、安全性、优化系统性能,而且会让系统更加易于调试、便于扩展。本文从多个角度去分析和讲解“序列化和反序列化”,并对比了当前流行的几种序列化协议,期望对读者做序列化选型有所帮助。   简介   文章作者服务于美团推荐与个性化组,该组致力于为美团用户提供每天billion级别的高质量个性化推荐以及排序服务。从Terabyte级别的用户行为数据,到Gigabyte级别的Deal/Poi数据;从对实时性要求毫秒以内的用户实时地理位置数据,到定期后台job数据,推荐与重排序系统需要多种类型的数据服务。推荐与重排序系统客户包括各种内部服务、美团客户端、美团网站。为了提供高质量的数据服务,为了实现与上下游各系统进行良好的对接,序列化和反序列化的选型往往是我们做系统设计的一个重要考虑因素。   本文内容按如下方式组织: 第一部分给出了序列化和反序列化的定义,以及其在通讯协议中所处的位置。 第二部分从使用者的角度探讨了序列化协议的一些特性。

计算机中数据的表示

不问归期 提交于 2020-02-05 02:03:27
进位计数制及其转换 在采用进位计数的数字系统中,如果只用R个基本符号(例如0,1,2,…,R-1)表示数值,则称其为R进制,R称为该数制的基数(Radix)。 不同数制度的共同特点: a.每一种数制都有固定的符号集。 b.每一种数制都使用位置表示法。即处于不同位置的数符所代表的值不同,与它所在位置的权值有关。例如,十进制 1234.55可表示为:1234.55=1x10 3 +2x10 2 +3x10 1 +4x10 0 +5x10 -1 +5x10 -2 计算机中常用的进位数制表示 不同进制之间的对照关系 进制间的相互转换 1.R进制转10进制 将R进制按权展开求和即可得相应的十进制数 例如 十六进制转十进制 (234)H= (2x16 2 +3x16 1 +4x16 0 )D =(564)D 八进制转十进制 (234)O= (2×8 2 +3×8 1 +4×8 0 )D = (156)D 二进制转十进制 (10110)B=(1×2 4 +0×2 3 +1×2 2 +1×2 1 +0×2 0 )D =(22)D 2.十进制转R进制 十进制数转换成R进制分为两部分:整数部分和小数部分。 整数部分 可以采用 “除R取余,逆序排列” 法,即将十进制整数部分连续地除以R取余数,直到商为0。 小数部分 转换成R进制数采用 “乘R取整,顺序排列” 法,即将十进制小数不断乘以R取整数

常用技巧 —— 位运算

烈酒焚心 提交于 2020-02-05 01:15:41
【概述】 在计算机中,数据都是以二进制形式存储的,因此位运算实质就是对整数在内存中的二进制位直接进行操作。 灵活使用位运算,不仅能有效的提高程序的效率,而且还能为代码提供亮点。 此外,在程序设计竞赛中,位运算,也是一种常考的要点,例如:树状数组中的 lowbit 函数的使用等,在 STL 容器中,bitset 也是一种常用的位运算工具。 关于 bitset: 点击这里 【应用】 位运算基础: 点击这里 异或运算实现两数交换: 点击这里 异或 1 的妙处: 点击这里 位运算应用: 点击这里 【例题】 And(CF-1013B) (基本位运算) : 点击这里 合法整数集(51Nod-1315) (位运算) : 点击这里 搬货物(51Nod-1596) (位运算) : 点击这里 FT Robot(AtCoder-3726) (bitset+思维) : 点击这里 Cupboards(CF-248A) (bitset+思维) : 点击这里 AND Minimum Spanning Tree(HDU-6614) (lowbit) : 点击这里 来源: CSDN 作者: Alex_McAvoy 链接: https://blog.csdn.net/u011815404/article/details/104173153

LeetCode 67.二进制求和

浪尽此生 提交于 2020-02-04 13:23:33
思路: 首先进行末位对齐,然后一位一位的相加,如果需要进位,那么创建一个进位变量, 再到下一位,下一位进行相加时,要带上变量 如果最长的一个二进制到了首位相加完,进位还是1的话 那么就再添加一个1出来, 最后进行字符串的翻转 代码: class Solution { public String addBinary ( String a , String b ) { StringBuilder sb = new StringBuilder ( ) ; int ca = 0 ; //进位 for ( int i = a . length ( ) - 1 , j = b . length ( ) - 1 ; i >= 0 || j >= 0 ; i -- , j -- ) { int sum = ca ; if ( i >= 0 ) { sum += a . charAt ( i ) - '0' ; } else { sum += 0 ; //不变 } if ( j >= 0 ) { sum += b . charAt ( j ) - '0' ; } else { sum += 0 ; //不变 } sb . append ( sum % 2 ) ; //添加相加结果 ca = sum / 2 ; //是否进位 } if ( ca == 1 ) { sb . append ( 1 ) ;

一行代码解决算法题

时间秒杀一切 提交于 2020-02-04 08:11:14
原文链接:https://blog.csdn.net/m0_37907797/article/details/104123066 一、2 的幂次方 问题描述:判断一个整数 n 是否为 2 的幂次方 对于这道题,常规操作是不断这把这个数除以 2,然后判断是否有余数,直到 n 被整除成 1 。 我们可以把 n 拆成二进制看待处理的,如果 n 是 2 的幂次方的话,那么 n 的二进制数的最高位是 1,后面的都是 0,例如对于 16 这个数,它的二进制表示为 10000。 如果我们把它减 1,则会导致最高位变成 0,其余全部变成 1,例如 10000 - 1 = 01111。 然后我们把 n 和 (n - 1)进行与操作,结果就会是 0,例如(假设 n 是 16) n & (n-1) = 10000 & (10000 - 1) = 10000 & 01111 = 0 也就是说,n 如果是 2 的幂次方,则 n & (n-1) 的结果是 0,否则就不是,所以代码如下 int isPow ( n ) { return ( n & ( n - 1 ) ) == 0 ; } 二、一行代码搞定经典的约瑟夫环 约瑟夫环问题,我相信大家在大一大二的时候就接触过了,很多人也都会拿来作为环形链表的一个应用,然而环形链表并非最优的解决方法,今天我就用一行代码干掉它,并且几乎算是最优解了。

leetcode颠倒二进制位java

落花浮王杯 提交于 2020-02-03 13:59:35
题干 颠倒给定的 32 位无符号整数的二进制位。 示例 1: 输入 : 00000010100101000001111010011100 输出 : 00111001011110000010100101000000 解释 : 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596 , 因此返回 964176192 ,其二进制表示形式为 00111001011110000010100101000000 。 示例 2: 输入: 11111111111111111111111111111101 输出: 10111111111111111111111111111111 解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293 , 因此返回 3221225471 其二进制表示形式为 10101111110010110010011101101001 。 提示: 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。 在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 2 中,输入表示有符号整数

python核心编程:七分钟全面了解位运算

醉酒当歌 提交于 2020-02-03 04:05:44
位运算是我们在编程中常会遇到的操作,但仍然有很多开发者并不了解位运算,这就导致在遇到位运算时会“打退堂鼓”。实际上,位运算并没有那么复杂,只要我们了解其运算基础和运算符的运算规则,就能够掌握位运算的知识。接下来,我们一起学习位运算的相关知识 文章目录 位运算的基础 二进制 补码 按位与 按位取反 左移运算 右移运算 位运算的应用 判断数字奇偶 变量交换 取 x 的第 k 位 代替地板除 程序中的数在计算机内存中都是以二进制的形式存在的,位运算就是直接对整数在内存中对应的二进制位进行操作。 位运算的基础 我们常用的 3, 5 等数字是十进制表示,而位运算的基础是二进制。即人类采用十进制,机器采用的是二进制,要深入了解位运算,就需要了解十进制和二进制的转换方法和对应关系。 二进制 十进制转二进制时,采用“除 2 取余,逆序排列”法: 用 2 整除十进制数,得到商和余数; 再用 2 整除商,得到新的商和余数; 重复第 1 和第 2 步,直到商为 0; 将先得到的余数作为二进制数的高位,后得到的余数作为二进制数的低位,依次排序; 排序结果就是该十进制数的二进制表示。例如十进制数 101 转换为二进制数的计算过程如下: 逆序排列即二进制中的从高位到低位排序,得到 7 位二进制数为 1100101,如果要转换为 8 位二进制数,就需要在最高位补 0。即十进制数的 8 位二进制数为