[PHP][位转换积累]之与运算截取二进制流的值

function getBit( $num, $bit, $mask ){
    return $num>>$bit&$mask;
}
var_dump( getBit( 41, 3, 7 ) );
var_dump( getBit( 0x29, 0x0, 0xf ) ); //十六进制表示法同样适用

此函数适合大端序的二进制流

取十进制数$num的第$bit位起至$mask位,返回值是十进制数

原理,把$num左移动至$bit位,然后跟$mask相与,得到的就是掩码掩住的几位二进制数,例如(也就是0000 1010),取9的第2至第4位(101,也就是十进制数5),先右移动1位,然后跟7(也就是0000 0111)相与,然后得到5(101)这个数,因为相与的位,只有双方都为1的时候才等于1,只有一方为0都等于0,所以掩码必须为左起连贯的1的二进制数, 例如0000 1111,0000 0111

时间: 2024-10-24 09:57:29

[PHP][位转换积累]之与运算截取二进制流的值的相关文章

[PHP][位转换积累]之异或运算的简单加密应用

异或的符号是^.按位异或运算, 对等长二进制模式按位或二进制数的每一位执行逻辑按位异或操作. 操作的结果是如果某位不同则该位为1, 否则该位为0. xor运算的逆运算是它本身,也就是说两次异或同一个数最后结果不变,即(a xor b) xor b = a.xor运算可以用于简单的加密,比如我想对我MM说1314520,但怕别人知道,于是双方约定拿我的生日19880516作为密钥.1314520 xor 19880516 = 20665500,我就把20665500告诉MM.MM再次计算20665

[PHP][位转换积累]之pack和unpack

http://my.oschina.net/goal/blog/195749?fromerr=pryT221q <?php $hex = unpack('H*','as'); var_dump( $hex ); var_dump( hexdec($hex[1]) ); var_dump( base_convert ( $hex[1] , 16 , 2 ) ); $bin = pack("a*", "da"); echo "output: "

%1不是有效的 win32应用程序(64位转换32位)

phpmyadmin打开时候显示 HTTP500内部服务器错误,用火狐浏览器显示的是%1不是有效的 win32应用程序.谷歌一下,终于找出问题,原来是windows2003 64位的操作系统和32位IIS的问题..最终找到解决方法如下: 要运行 32 位版本的 ASP.NET 2.0,请按照以下步骤操作:1. 单击"开始",单击"运行",键入 cmd,然后单击"确定". 2. 键入以下命令启用 32 位模式: cscript %SYSTEMDRI

HTTP500错误:%1不是有效的 win32应用程序(64位转换32位)

IE--internet选项--高级--"显示友好的HTTP错误信息"  前面的勾取消 网站具体错误信息:%1不是有效的 win32应用程序(64位转换32位) 原因:在windows 2003 64位系统上安装完iis后,运行PHP文件提示%1不是有效的 win32应用程序,原来是windows2003  64位的操作系统和32                                       位IIS的问题. 解决办法:要运行 32 位版本的 ASP.NET 2.0 具体

php位运算与二进制

?  二进制 二进制就是用0和1来表示计算机语言的,0,1可以表示任意数,其逢二进一 二进制有三个重要概念 ?位运算 位运算符运算规则: 按位与&:两位全为1,结果为1 按位或|:两位有一个为1,结果为1 按位异或^:两位中一个为0,一个为1,结果为1 按位取反~:0取1,1取0 根据规则, 计算一个数的步骤: 例如计算:~2=? 1.找出2的补码,[因为计算机运算是以补码的方式来进行运算的] 2的原码:00000000 00000000 00000000 00000010 //上面的字串从左往

c语言:获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。

获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列. 程序: #include<stdio.h> int main() { int i, j, num; char arr1[16]; char arr2[16]; printf("输入一个整数:"); scanf("%d", &num); for (i = 0, j = 0; i < 32; i += 2, j++) { arr1[15 - j] = (num >> 

js base64位和c# Base64位转换

<script> /* 编码规则 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码. 它将需要编码的数据拆分成字节数组. 以3个字节为一组.按顺序排列24 位数据,再把这24位数据分成4组,即每组6位. 再在每组的的最高位前补两个0凑足一个字节. 这样就把一个3字节为一组的数据重新编码成了4个字节. 当所要编码的数据的字节数不是3的整倍数, 也就是说在分组时最后一组不够3个字节. 这时在最后一组填充1到2个0字节. 并在最后编码完成后在结尾添加1到2个 “=”. *

nowcoder 211E - 位运算?位运算! - [二进制线段树][与或线段树]

题目链接:https://www.nowcoder.com/acm/contest/211/E 题目描述 请实现一个数据结构支持以下操作:区间循环左右移,区间与,区间或,区间求和. 输入描述: 第一行n,q表示数列长度及操作次数.第二行n个数表示初始序列.接下来q行表示操作. 操作格式如下:一行表示一个操作.所有操作形如 opt l r v.opt=1 表示将区间[l,r]循环右移v位.opt=2 表示将区间[l,r]循环左移v位.opt=3 表示将区间[l,r]按位或上v.opt=4 表示将区

如何不利用一个额外的变量来达到交换两个变量值的目的-------位上的异或运算

问题:一般我们要交换两个变量的值,多会采取一个额外变量来实现,比如temp=a,a=b,b=temp,现在我们能不利用temp来实现交换a,b两个变量值的目的吗? 解决方案:^异或运算符,而且我们会发现a^a=0,还有0^a=a,依据这两条理论,我们可以实现之前提出的问题. 代码如下: #include<stdio.h>void inplace_swap(int * x,int * y){    *y=*x^*y;    *x=*x^*y;    *y=*y^*x;}int main(){