int是啥,int百科

  

  计算百度百科如下:3360   

  

  程序中的所有数字都以二进制形式存储在计算机内存中。位运算是直接对内存中整数的二进制位进行运算。   

  

  位运算的优点位运算是一种底层运算,往往比我们普通的运算要快。许多位操作效率最高,占用的内存最少。最有效的位操作是二进制数,它具有一些二进制特征。在实际问题中,使用位运算比较方便,只需要较低的空间要求。位运算可以使程序更加简洁美观。位操作可以表示一些状态集。下面的A和B是整数类型,所以:   

  

  意义   

  

  c编程语言   

  

  一点一点地   

  

  有   

  

  按下钻头或   

  

  a | b   

  

  按位异或   

  

  有   

  

  逐位反转   

  

  ~a   

  

  左移   

  

  有   

  

  有符号右移位   

  

  有   

  

  无符号右移   

  

  在C #优先级语言中的按位运算符之间,优先级的顺序是   

  

  优先   

  

  标志   

  

  一个   

  

  ~   

  

  2   

  

  、   

  

  三   

  

  四   

  

  ^   

  

  五   

  

  |   

  

  六   

  

  =、^=、|=、=、=   

  

  概念和技巧本文将演示C语言交互环境中的代码。   

  

  常见的二进制位转换操作   

  

     

  

  and运算判断奇偶数。对于除0以外的任意数x,可以用x1==1作为逻辑判断。   

  

  If (x1==1){}判断一个二进制位是否为1,例如第7位。如果0x40变为二进制位0100 0000,则表示第7位为1。   

  

  If (n0x40){ //TODO:添加要处理的代码}字节读取(x 0)0x000000ff/*获取第0个字节*/(x 8)0x000000ff/*获取第1个字节*/(x 16)0x000000ff/*获取第2个字节*/获取第3个字节*/指数bool ispowerofwo (int n)判断一个数是否为2 {if (n=0)返回falsereturn(n(n-1))==0;}取余数,(除数为2的n次方)//得到余数int Yu(int num,int n){ int I=1n;返回编号(I-1);}指定要截取的二进制位数,比如16位二进制数A: 1001 1001 1001 1000。如果你想得到A的哪个位的值,就把数字B的位:0000 0000 0000 0000设置为1。   

  

  比如我想得到A的第三位,我就把B的第三位设为1,那么B就是000000000100。设置好之后,我会对A和b求和,如果结果是0,说明A的第三位是0,结果是1,说明A的第三位是1。   

  

  同理:要得到A的第五位,设B为0000 0000 0001 0000,然后自讨苦吃。   

  

  通常在我们的程序中,数字B被称为掩码,意思是专门用来检验某一位是否为0的数值。   

  

  用x=x(x-1)计算二进制1的个数,用二进制表示x时最右边的1会变成0,因为x-1会把这个位变成0。   

  

  int Count(int x){ int sum=0;while(x){ sum;x=x(x-1);}返回sum}or运算生成组合码,压缩状态。当二进制用作集合时,or运算可用于元素相加。合并加密字节码时,需要将两个加密位再次合并成一个字节,然后进行or运算。   

  

  求一个数int Grial(int x){ int count=0的二进制表达式中零的个数;while(x ^ 1){ count;x |=(x ^ 1);}返回计数;}异或运算两个整数交换变量名void swap(int a,int b){ a ^=b b;b ^=a;a ^=b;}判断两个数是否符号不同int x=-1,y=2;bool f=((x ^ y)0);//trueint x=3,y=2;bool f=((x ^ y)0);//假数据加密对待加密的内容为A,密钥为B,A B=加密。   

内容C。而解密时只需要将C ^ 密钥B=原内容A。如果没有密钥,就不能解密!

  

#include <stdio.h>#include <stdlib.h>#include <string.h>#define KEY 0x86int main(){ char p_data<16> = {"Hello World!"}; char Encrypt<16>={0},Decode<16>={0}; int i; for(i = 0; i < strlen(p_data); i++) { Encrypt = p_data ^ KEY; } for(i = 0; i < strlen(Encrypt); i++) { Decode = Encrypt ^ KEY; } printf("Initial date: %s\n",p_data); printf("Encrypt date: %s\n",Encrypt); printf("Decode date: %s\n",Decode); return 0;}数字判重利用了二进制数的性质:x^y^y = x。我们可见,当同一个数累计进行两次xor操作,相当于自行抵销了,剩下的就是不重复的数

  

找出没有重复的数int find(int<> arr){ int tmp = arr<0>; for(int i = 1;i < arr.length; i++){ tmp = tmp ^ arr; } return tmp;}not操作交换符号int reversal(int a) { return ~a + 1;}取绝对值(效率高)n>>31 取得n的符号若n为正数,n>>31等于0若n为负数,n>>31等于-1若n为正数 n^0=0,数不变若n为负数,有n^-1 需要计算n和-1的补码,然后进行异或运算,结果n变符号并且为n的绝对值减1,再减去-1就是绝对值int abs(int n){ return (n ^ (n >> 31)) - (n >> 31);}也可以这样使用

  

int abs(int n){ int i = n >> 31; return i == 0 ? n : (~n + 1);}从低位到高位.将n的第m位置1将1左移m-1位找到第m位,得到000...1...000, n在和这个数做或运算

  

int setBitToOne(int n, int m){ return n | (1 << (m-1));}同理从低位到高位,将n的第m位置0,代码如下

  

int setBitToZero(int n, int m){ return n & ~(1 << (m-1));}shl操作 & shr操作求2的N次方 1<<n高低位交换unsigned short a = 34520;a = (a >> 8) | (a << 8);进行二进制逆序unsigned short a = 34520;a = ((a & 0xAAAA) >> 1) | ((a & 0x5555) << 1);a = ((a & 0xCCCC) >> 2) | ((a & 0x3333) << 2);a = ((a & 0xF0F0) >> 4) | ((a & 0x0F0F) << 4);a = ((a & 0xFF00) >> 8) | ((a & 0x00FF) << 8);获得int型最大最小值int getMaxInt(){ return (1 << 31) - 1;//2147483647, 由于优先级关系,括号不可省略}int getMinInt(){ return 1 << 31;//-2147483648}m的n次方//自己重写的pow()方法int pow(int m , int n){ int sum = 1; while(n != 0){ if(n & 1 == 1){ sum *= m; } m *= m; n = n >> 1; } return sum;}找出不大于N的最大的2的幂指数int findN(int n){ n |= n >> 1; n |= n >> 2; n |= n >> 4; n |= n >> 8 // 整型一般是 32 位,上面我是假设 8 位。 return (n + 1) >> 1;}二分查找32位整数的前导0个数int nlz(unsigned x){ int n; if (x == 0) return(32); n = 1; if ((x >> 16) == 0) {n = n +16; x = x <<16;} if ((x >> 24) == 0) {n = n + 8; x = x << 8;} if ((x >> 28) == 0) {n = n + 4; x = x << 4;} if ((x >> 30) == 0) {n = n + 2; x = x << 2;} n = n - (x >> 31); return n;}位图的操作将 x 的第 n 位置1,可以通过 x |= (x << n) 来实现

  

set_bit(char x, int n);将 x 的第 n 位清0,可以通过 x &= ~(1 << n) 来实现

  

clr_bit(char x, int n);取出 x 的第 n 位的值,可以通过 (x >> n) & 1 来实现

  

get_bit(char x, int n);如下:

  

#define clr_bit(x, n) ( (x) &= ~(1 << (n)) )#define set_bit(x, n) ( (x) |= (1 << (n)) )#define get_bit(x, n) ( ((x)>>(n)) & 1 )综合应用以下仅列出,感兴趣可以参考下面链接.

  

关于操作计数方法

  

计算整数的符号

  

检测两个整数是否具有相反的符号

  

计算无分支的整数绝对值(abs)

  

计算两个整数的最小值(最小值)或最大值(最大值),而无需分支

  

确定整数是否为2的幂

  

标志延伸

  

从恒定位宽扩展的符号从可变位宽扩展的符号通过3个操作从可变位宽扩展符号 有条件地设置或清除位而不分支有条件地否定一个值而不分支

  

根据掩码合并两个值中的位

  

计数位设置

  

计数位设置,幼稚的方式计算由查找表设置的位数位集,Brian Kernighan的方式使用64位指令对14、24或32位字中设置的位进行计数并行设置计数位从最高有效位到给定位置的计数位的设置(等级)从给定的计数(等级)中选择位位置(从最高有效位开始)计算奇偶校验(如果设置了奇数位数,则为1,否则为0)

  

天真地计算单词的奇偶性通过查找表计算奇偶校验使用64位乘法和模数除法计算字节的奇偶校验用乘法计算单词的奇偶校验并行计算奇偶校验交换价值

  

用减法和加法交换值用XOR交换值用XOR交换单个位反转位序列

  

反转位是显而易见的方式逐字查找表中的位反转通过3个操作(64位乘法和模数除法)反转字节中的位通过4个操作反转字节中的位(64位乘法,无除法)通过7个操作反转字节中的位(无64位,仅32位)与5 * lg(N)个运算并行地反转N位数量模数除法(又名计算余数)

  

在不进行除法运算的情况下,将模数除以1 << s(显而易见)在不进行除法运算的情况下以(1 << s)-1计算模数除法不进行除法运算就并行计算(1 << s)-1的模数除法查找整数的整数对数2(又称最高位集的位置)

  

使用O(N)运算找到MSB N设置为整数的对数2(显而易见的方法)查找具有64位IEEE浮点数的整数的整数对数2使用查找表找到整数的对数2在O(lg(N))运算中找到N位整数的对数2使用乘法和查找在O(lg(N))操作中找到N位整数的对数2查找整数的对数以10为底的整数

  

查找整数的整数对数10

  

查找32位IEEE浮点数的整数对数基数2

  

查找32位IEEE浮点的pow(2,r)根的整数对数基数2(对于无符号整数r)

  

计算连续的尾随零位(或查找位索引)

  

线性计算右边的连续零位(后缀)并行计算右侧连续的零位(后缀)通过二进制搜索计算右边连续的零位(跟踪)通过强制转换为浮点数来计算右侧连续的零位(跟踪)用模数除法和查找计算右边连续的零位(跟踪)用乘法和查找计数右边连续的零位(后跟)通过浮法舍入到2的下一个最高幂

  

向上舍入到2的下一个最高幂

  

交织位(也称为计算莫顿数)

  

交错位的明显方式通过表查找交织位带64位乘法的交织位通过二进制幻数交错位测试单词中的字节范围(并计算出现的次数)

  

确定单词是否为零字节确定一个单词的字节数是否等于n确定一个单词的字节数是否小于n确定单词的字节数是否大于n确定单词是否在m和n之间有一个字节按词典顺序计算下一位排列

相关文章