question

判断一个数是否是2的n次方

thinking

首先如果是2的n次方数一定是表示这个数最高有效位位1,剩下的全部为0

例如

decimal:8

binary: 1000

如果这个是2的n次方,将这个数-1,则-1后的数的位数全部为1

decimal: 7

binary: 0111

所以 (n&(n-1)) == 0 即为2的n次方数

answer

php:

<?php

is2SubSquare((int)$argv[1]);

function is2SubSquare(int $number)
{
    if((($number & ($number - 1)) === 0)){
        echo 'true';
    }else{
        echo 'false';
    }
}

c++:

#include<iostream>
using namespace std;

int main()
{
    int decimal;
    int temp;
    cout << "请输入一个数字,按回车结束" << endl;
    cin >> decimal;

    temp = decimal - 1;

    if((decimal & temp) == 0){
        cout << "true" << endl;
    }else{
        cout << "false" << endl;
    }
}

brainstorm1

业务代码写多了,算法、数据结构、基础知识差不多都要忘完了.

如何 将一个十进制数转换成二进制数

imgs

C++:

#include<iostream>
using namespace std;        

void decimalToBinary(int decimal) {
    int binaryNum[1000];
    int i = 0;

    while(decimal > 0){
    binaryNum[i] = decimal % 2;
    decimal = decimal / 2;
    i++;
}
for (int j = i - 1; j >= 0; j--)
{
    cout <<  binaryNum[j];
}

}


int main()
{
    int decimal;
    int temp;
    cout << "请输入一个数字,按回车结束" << endl;
    cin >> decimal;
    decimalToBinary(decimal);
}

python:

#-*- coding:utf-8 -*-
from sys import argv

def dec2bin(num):
    l = []
    while True:
        num, remainder = divmod(num, 2)
        l.append(str(remainder))
        if num == 0:
        # l[::-1]倒序输出,from length - 1 to 0.  l[::n], 0 to n 
            return ''.join(l[::-1])

if __name__ == '__main__':

    num = int(argv[1]);
    print(dec2bin(num));

java:

import java.io.*; 

class DecimalToBinary  
{ 
    static void dec2Binary(int n) 
    { 
        int[] binaryNum = new int[1000]; 
        int i = 0; 
        while (n > 0)  
        { 
            binaryNum[i] = n % 2; 
            n = n / 2; 
            i++; 
        } 
        for (int j = i - 1; j >= 0; j--) 
            System.out.print(binaryNum[j]); 
    } 
    public static void main (String[] args)  
    { 
        int n = 1024; 
        dec2Binary(n); 
    } 
} 

brainstorm2

PHP 二进制安全(binary safe)

我们看手册里对strcoll的描述

imgs

再看代码:

<?php
$string1 = "Hello";
$string2 = "Hello\0Hello";
echo strcoll($string1, $string2); /*返回0, 由于是非二进制安全,误判为相等 */
echo strcmp($string1, $string2);  /*返回<0,不相等*/

PHP是基于C实现的,PHP代码都会被zend引擎编译成opcode,最终作为C语言去执行。 而对于c语言‘\0’是字符串的结束符,它读到’\0’就会默认字符读取已经结束,从而抛掉后面的字符串.

参考

php手册经常见到,什么是“二进制安全”?CSDN博客

PHP有趣的细节:二进制安全 github
PHP是如何实现二进制安全的?

既然PHP是基于C实现的,C字符串类型不是二进制安全的,PHP又是如何实现的呢?这就是数据结构的功劳了。 PHP的内核中,是如此定义字符串类型的

imgs

下了php5.6源码,/php-5.6.37/Zend/zend.h,查看到下面一段定义:

val是指向字符串内存的指针,len表示该字符串的长度,无论是否遇到“\0”字符,C都按照len长度读取该字符串。

发表评论

电子邮件地址不会被公开。 必填项已用*标注